在光照強度明暗不一的情況下,該采用RGB還是HSV通道來檢測圖片?


如果光線不好,有陰影,斑駁,或者太亮的話簡單的用顏色閾值就不太適用了,我們要如何完整的檢測出處於不同光線下的物體? 圖像表示方式還有HSV(H(色相)S(飽和度)V(明度)),HLS(H(色相)L(亮度)S(飽和度)) 在HSV中,V受光照的影響最大,而H基本不受陰影或過高亮度的影響,如果我們依靠這個通道,舍棄V通道的信息,那就能對彩色物體進行檢測,而且效果會比在RGB顏色空間中更為可靠。

import numpy as np
import matplotlib.pyplot as plt
import cv2
%matplotlib inline
image = cv2.imread('3.png')
image_copy = np.copy(image)
image_copy = cv2.cvtColor(image_copy,cv2.COLOR_BGR2RGB)
plt.imshow(image_copy)

下面是采用RGB通道:

r = image_copy[:,:,0]
g = image_copy[:,:,1]
b = image_copy[:,:,2]
f,(ax1,ax2,ax3) = plt.subplots(1,3,figsize=(20,10))
ax1.set_title('Red')
ax1.imshow(r,cmap='gray')
ax2.set_title('Green')
ax2.imshow(g,cmap='gray')
ax3.set_title('Blue')
ax3.imshow(b,cmap='gray')

下面是采用HSV通道:

hsv = cv2.cvtColor(image_copy,cv2.COLOR_RGB2HSV)
h = hsv[:,:,0]
s = hsv[:,:,1]
v = hsv[:,:,2]
f,(ax1,ax2,ax3) = plt.subplots(1,3,figsize=(20,10))
ax1.set_title('Hue')
ax1.imshow(h,cmap='gray')
ax2.set_title('Saturation')
ax2.imshow(s,cmap='gray')
ax3.set_title('Value')
ax3.imshow(v,cmap='gray')

lower_pink = np.array([180,0,100])
upper_pink = np.array([255,255,230])
lower_hue = np.array([160,0,0])
upper_hue = np.array([180,255,255]) #允許小范圍的高值色相通過 通道范圍在 160 - 180 之間,飽和度和明度通道則不作限制 都為 0 - 255
mask_rgb = cv2.inRange(image_copy,lower_pink,upper_pink)
masked_image = np.copy(image_copy)
masked_image[mask_rgb == 0] = [0,0,0]
plt.imshow(masked_image)
plt.title('RGB selection')

mask_hsv = cv2.inRange(hsv,lower_hue,upper_hue)
masked_image = np.copy(image_copy)
masked_image[mask_hsv == 0] = [0,0,0]
plt.imshow(masked_image)
plt.title('hsv selection')

emmmm,按道理hsv更擅長選擇處於不同光線下的區域的,但我我這個。。。翻車了,圖片選擇不太對,記住結論就好。。。

 在HSV中,V受光照的影響最大,而H基本不受陰影或過高亮度的影響,如果我們依靠這個通道,舍棄V通道的信息,那就能對彩色物體進行檢測,而且效果會比在RGB顏色空間中更為可靠。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM