OpenCV之通道分离合并与二值化操作
1. 通道的分离与合并
在图像预处理中我们有时候要将图片的各个通道进行分析,在OpenCV中提供相应的API进行通道的分离与合并,具体如下:
import cv2 as cv
import numpy as np
path = "C:\\Users\\27914\\Desktop\\images\\test2.jpg"
image = cv.imread(path)
channels = cv.split(image)
channels[0][:,:],channels[1][:,:],channels[2][:,:] = channels[0][:,:]/2,channels[1][:,:]/2,channels[2][:,:]/2
result = cv.merge(channels)
mix = np.zeros_like(image)
cv.mixChannels([image],[mix],fromTo=[0,1,2,2,0,1])
cv.imshow("image",image)
cv.imshow("result",result)
cv.imshow("mix",mix)
cv.waitKey(0)
cv.destroyAllWindows()
通道分离用到的是split(),与python自带的split函数差不多,传入要分离的图像即可,得到的是长度与原图像通道数相同的列表,一个通道即为一个元素(ndarray)。合并通道用的是merge(),只要传入要合并的单通道即可,会按照列表中单通道的顺序依次作为B、G、R合并,一般split和merge是配套使用。若要交换通道,可以使用mixChannels(),第一个参数为原图(注意传入的应为列表),第二个参数为输出的图片(同样也需要是列表),fromto参数原图像通道赋给输出图像时的对应关系,在本例即是将原图的第1,2,3通道依次赋给输出图像的第3,1,2通道。输出如下:
原图:
各通道像素值除以2:
通道交换:
2. 二值化处理
图像的二值化处理是确定一个阈值,在像素值在阈值之内的地方显示为白色,在阈值之外的显示为黑色,这里主要是使用inRange()对图像进行分割(threshold()相关的二值化方法后面再讲),具体如下:
import cv2 as cv
path = "C:\\Users\\27914\\Desktop\\images\\test3.jpeg"
image = cv.imread(path)
hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
mask_ = cv.inRange(hsv,(35,43,46),(77,255,255))#二值化,阈值内为白,阈值外为黑
mask_ = cv.bitwise_not(mask_)#取反
result = cv.bitwise_and(image,image,mask=mask_)#mask参数为掩码,将白色部分像素按位与,黑色部分保留黑色
cv.imshow("result",result)
cv.waitKey(0)
cv.destroyAllWindows()
原始图片的背景为纯绿色,将图片转换成HSV色彩空间后,对照查找表,将绿色的部分和非绿色部分分开(即二值化),取非后,原非绿色部分为白色,绿色部分为黑色,由于原图与原图进行与操作得到的还是原图,所以在非绿色区域进行原图之间的与操作,使得原图中非绿色区域的像素得到保留,具体输出如下:
原图:
分割后:
实现了图像的分割。
附上HSV中各种颜色的阈值:
- 点赞
- 收藏
- 关注作者
评论(0)