Files
cloudage/cloudage.py
tangchao daeafd9659 (1)自己计算饱和度
(2)计算云、薄云、天空云量的均值和标准差
2022-05-17 17:43:27 +08:00

123 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime, math, os, sys, logging
import cv2
import numpy as np
def f1(image_path):
# Load an image
img = cv2.imread(image_path)
# img = cv2.imread(image_path, 0) # Load an image in grayscale
b, g, r = cv2.split(img)
cloud = r / b
ret, cloud_BINARY = cv2.threshold(cloud, 0.6, 255, cv2.THRESH_BINARY) # 文献中推荐阈值为0.6
cloudage = cloud_BINARY.sum() / (cloud_BINARY.size * 255)
print("r/b算法云量为%f\n" % cloudage)
tmp = image_path.split('.')
out = tmp[0] + "_r_b." + tmp[1]
cv2.imwrite(out, cloud_BINARY)
# cv2.imshow('image', cloud_BINARY)
cv2.waitKey(0)
cv2.destroyAllWindows()
def f2(image_path):
img = cv2.imread(image_path)
b, g, r = cv2.split(img)
cloud = (b-r) / (b+r)
ret, cloud_BINARY = cv2.threshold(cloud, 0.2, 255, cv2.THRESH_BINARY_INV)
cloudage = cloud_BINARY.sum() / (cloud_BINARY.size * 255)
print("(b-r) / (b+r)算法,云量为%f\n" % cloudage)
tmp = image_path.split('.')
out = tmp[0] + "_(b-r)_(b+r)." + tmp[1]
cv2.imwrite(out, cloud_BINARY)
# cv2.imshow('image', cloud_BINARY)
cv2.waitKey(0)
cv2.destroyAllWindows()
def f3(image_path):
img = cv2.imread(image_path)
b, g, r = cv2.split(img)
# 自己计算饱和度-----> 失败:计算的饱和度不对,是负值
ones = np.ones_like(b)
sum = b + g + r
min_b_g_r = np.zeros_like(b)
for x in range(b.shape[0]):
for y in range(b.shape[1]):
minValue = min(b[x, y], g[x, y], r[x, y])
min_b_g_r[x, y] = minValue
tmp = (3/sum)*min_b_g_r
s_tc = ones - tmp
# 转到HSV空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h1, s1, v1 = cv2.split(hsv)
# 转到HLS空间
hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS) # 这就是ihs颜色空间
h, l, s = cv2.split(hls)
μ_Clouds = 12.7
σ_Clouds = 3.7
μ_sky = 45.3
σ_sky = 4.4
# np.where用法https://www.zhihu.com/question/62844162
clouds_loc = np.where(s < μ_Clouds + 3 * σ_Clouds) # 厚云
sky_loc = np.where(s > μ_sky - 3 * σ_sky) # 天空
unknow_loc = np.where((μ_Clouds + 3 * σ_Clouds <= s) & (s <= μ_sky - 3 * σ_sky)) # 薄云
s[sky_loc] = 1
s[clouds_loc] = 2
s[unknow_loc] = 3
tmp = image_path.split('.')
out = tmp[0] + "_saturation." + tmp[1]
cv2.imwrite(out, s)
# cv2.imshow('image', cloud_BINARY)
cv2.waitKey(0)
cv2.destroyAllWindows()
def jisuan(image_path):
img = cv2.imread(image_path)
hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS) # 这就是ihs颜色空间
h, l, s = cv2.split(hls)
mean = np.mean(s)
var = np.var(s)
print("均值为:%f\n" % mean)
print("方差为:%f\n" % var)
if __name__ == '__main__':
train_image_path1 = r'D:\PycharmProjects\cloudage\train\sky.jpg'
train_image_path2 = r'D:\PycharmProjects\cloudage\train\cloude.jpg'
train_image_path3 = r'D:\PycharmProjects\cloudage\train\light cloud.jpg'
jisuan(train_image_path1)
jisuan(train_image_path2)
jisuan(train_image_path3)
# image_path = r'D:\PycharmProjects\cloudage\photo\photo12.jpg'
# # image_path = r'D:\PycharmProjects\cloudage\photo\cloud1_perfect.jpg' # f3全为天空
# # f1(image_path)
# # f2(image_path)
# f3(image_path)