电子说
3、图像基本认知: RGB 、 Gray 、 HSV等
GARY色彩空间(灰度图像)通常指8位灰度图,具有256个灰度级,像素值的范围是[0,255]。不同数值表示不同程度的灰色。像素值越低,灰色越深。0表示纯黑色,255表示纯白色。GARY色彩空间为单通道,所以通常用二维数组表示一幅灰度图像。
二值图像:只有0和255两种像素值的灰度图像。
RGB是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R),绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。
OpenCV中通道排序为BGR
B(Blue) 蓝色 取值范围:[0,255]
G(Green) 绿色 取值范围:[0,255]
R(Red) 红色 取值范围:[0,255]
自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而RGB颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。
H(Hue) 色调,色相 取值范围:[0,179]
S(Saturation) 饱和度,色彩纯净度 取值范围:[0,255]
V(Value) 明度 取值范围:[0,255]
HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。
在图像处理中使用较多的是HSV颜色空间,它比RGB更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。
H(Hue) 色相
L(Lightness) 亮度
S(Saturation) 饱和度
HLS中的L分量为亮度,亮度为100,表示白色,亮度为0,表示黑色;HSV 中的 V 分量为明度,明度为100,表示光谱色,明度为0,表示黑色。
4、通道分离与合并、色域转换、像素运算
def ChannelOp():
# 通道分离与合并
img = np.zeros([500,500,3],np.uint8)
print(img.size,img.shape)
# 通道分离,b,g,r
b,g,r = cv2.split(img)
# 将b,g通道中的10:100变成白色255,b+g混合后得到青色
b[10:100,10:100] = 255
g[10:100,10:100] = 255
img1 = cv2.merge((b,g,r))
cv2.imshow('imshow',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例
def ConvertColor():
img = cv2.imread("./images/test.jpg")
# 色彩空间
color_space = [cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2RGBA,
cv2.COLOR_BGR2RGB,cv2.COLOR_BGR2HLS,
cv2.COLOR_BGR2HSV,cv2.COLOR_BGR2YUV,
cv2.COLOR_BGR2BGRA]
# 转换
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 二值化处理
# ower_red指的是图像中低于这个lower_red的值,图像值变为0
# upper_red指的是图像中高于这个upper_red的值,图像值变为0
# 在lower_red~upper_red之间的值变成255, 其余的为0
lowerb = np.array([100,100,100])
upperb = np.array([200, 200, 200])
mask = cv2.inRange(img,lowerb=lowerb,upperb=upperb)
cv2.imshow('imshow',mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例,二值化处理
图像运算
def PixelOp():
img1 = cv2.imread('./images/10.jpg')
img2 = cv2.imread('./images/test.jpg')
# 需要两张图片大小格式完全一样
img1 = cv2.resize(img1,(720,400),interpolation=cv2.INTER_AREA)
img2 = cv2.resize(img2, (720, 400), interpolation=cv2.INTER_AREA)
# 对应位置元素相加,如果大于255则取255
new_img_add = cv2.add(img1,img2)
# 对应位置元素相减,如果小于0则取0
new_img_sub = cv2.subtract(img1,img2)
# 对应位置元素相乘
new_img_mu = cv2.multiply(img1,img2)
# 对应位置元素相除
new_img_di = cv2.divide(img1,img2)
# 图像融合,按权重融合
new_img_w = cv2.addWeighted(img1,0.2,img2,0.6,0)
# 与或非,对应元素进行异或
# 非:相当于255-pixel,异或:两者相等为0,不等为1
new_img_and = cv2.bitwise_and(img1,img2)
new_img_or = cv2.bitwise_or(img1,img2)
new_img_not = cv2.bitwise_not(img1)
new_img_xor = cv2.bitwise_xor(img1,img2)
cv2.imshow("imshow",new_img_xor)
cv2.waitKey(0)
cv2.destroyAllWindows()
全部0条评论
快来发表一下你的评论吧 !