python RGB转HSV 阴影识别

  • 什么是阴影?
    成因不同可以分为两种:自影,投影
    自影(Self-shadow)的形成原因是物体的位置处于阴影之中,自身本就没有被光线照射到,而投影(Cast shadow)则是物体遮挡光线留下阴影,投射在其他物体的表面。
    阴影本身被分为本影区和半影区,本影区(Umbra)一般处于阴影的内部区域,因所有直射的光线都被物体遮挡而形成。而半影区(Penumbra)则一般位于阴影的边缘区域,亮度呈现由内向外渐变为亮的效果。
    根据光源的远近和强弱,形成的阴影又分为硬阴影和软阴影。硬阴影(Hard shadow)一般都是比较锐利、浓重的阴影,一般是强光或光源较近时形成的;阴影(Soft shadow)则是与之相反,指的是模糊、柔和的阴影。
  • 如何将RGB图像转为HSV图像
    python RGB转HSV 阴影识别_第1张图片
    原图如上,进行HSV转换。
import cv2
image = r'E:\odmxiaoyuan\notree\right\class_rec_A\10\18.jpg'
img = cv2.imread(image)
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转为灰度图
img_hsv =cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#转换为HSV三通道图像
H,S,V=cv2.split(img_hsv)#将三通道分开
plt.figure(figsize=(10,4.5))
fs = 15
plt.subplot(2,2,1)
plt.tick_params(labelbottom=False, labelleft=False)
plt.imshow(img_hsv,cmap='hsv')
plt.title('HSV', fontsize=fs)
plt.subplot(2,2,2)
plt.tick_params(labelbottom=False, labelleft=False)
plt.imshow(H)
plt.title('H(hue)', fontsize=fs)
plt.subplot(2,2,3)
plt.tick_params(labelbottom=False, labelleft=False)
plt.imshow(S)
plt.title('S(saturation)', fontsize=fs)
plt.subplot(2,2,4)
plt.tick_params(labelbottom=False, labelleft=False)
plt.imshow(V)
plt.title('V(value)', fontsize=fs)

python RGB转HSV 阴影识别_第2张图片
H为色调,S为饱和度,V为亮度。
在HSV模型中,阴影区域主要有以下特点:
①具有更大的色调值H;
②具有高饱和度S,因为散射光线主要来自波长更短的蓝紫色光;
③太阳光线被阻挡,导致明度V较低。
④当图像转换到频域时,阴影区域显示为低频
⑤阴影区域的表面纹理属性会被保留下来。
⑥色彩恒常性,光强度变化不会影响人眼的判断。对于同一对象,只要亮度相同,对于人的视觉系统来说,相同纹理背景的阴影区域和非阴影区域的视觉效果都相同。例如:在 RGB 颜色空间中,若某区域 3 通道的颜色值都以相同比例减小,那么该区域大概率属于阴影区域。阴影区域的图像色调是几乎保持不变的。色调即为 3 通道颜色值的比率。阴影和非阴影区交汇的边缘和自身所属区域的纹理特征基本保持一致,这样的性质就是色彩恒常性。

1、检测阴影的方法直接的是阈值法。就是使用一个阈值 T 0 T_0 T0使得 T > T 0 T>T_0 T>T0则为阴影, T < T 0 TT<T0则为非阴影。这个阈值可使用迭代来确定:
大律法(Otsu)计算阈值

m = double(((s - v) / (h + s + v)))
img_nos=np.where(m,255,img_gray)#阴影部分像素转为255,其他为灰度值

2、连续两次进行HSV彩色空间变换,区分阴影。

优化:进行图像的腐蚀和扩展算子将散落的点形成面。

你可能感兴趣的:(遥感图像处理,python,计算机视觉,opencv)