OpenCV之通道分离合并与二值化操作

举报
Y_K_C 发表于 2021/11/29 22:37:59 2021/11/29
【摘要】 声明:本文是OpenCV入门级别的技术分享,主要围绕图像预处理来进行学习,所用语言均为Python。

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通道。输出如下:
原图:
image.png
各通道像素值除以2:
image.png
通道交换:
image.png

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色彩空间后,对照查找表,将绿色的部分和非绿色部分分开(即二值化),取非后,原非绿色部分为白色,绿色部分为黑色,由于原图与原图进行与操作得到的还是原图,所以在非绿色区域进行原图之间的与操作,使得原图中非绿色区域的像素得到保留,具体输出如下:
原图:
image.png
分割后:
image.png
实现了图像的分割。
附上HSV中各种颜色的阈值:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。