OpenCV之图像处理基础

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达
 
 

2233db85eca3c6023adf8fef58bb623c.png

这篇文章介绍图像的基本表示方法、像素的访问和操作、感兴趣区域处理、通道处理等知识点。需要说明的是,在使用面向python的OpenCV必须熟练掌握Numpy库,尤其是Numpy.array库是python处理图像的基础。

图像的基本表示方法

这里只讨论二值图像、灰度图像、彩色图像的基本表示方法。

二值图像

二值图像是指仅仅包含黑色和白色两种颜色的图像。在计算机中,将白色像素点处理为“1”,将黑色像素点处理为“0”,以方便进行后续的存储和处理等操作。由于图像只有黑色和白色两种不同的颜色,因此只使用一个比特位就能表示。

灰度图像

由于二值图像表示简单,只有黑色和白色两种颜色,所以表示的图像不够细腻。通常在计算机中,会将灰度处理为256个灰度级,用数值区间[0,255]来表示。其中,数值“255”表示纯白色,数值“0”表示纯黑色,其余的数值表示从纯白色到纯黑之间不同级别的灰度。0~255个灰度级的数值,可以用一个八位二进制表示(一个字节)。

彩色图像

相比于二值图像和灰度图像,彩色图像识更常见的一类图像,它能表现更丰富的细节信息。彩色图像是建立在一个RGB色彩空间中的,R--red,红色;G--green,绿色;B--blue,蓝色;一共三个通道,且每个通道的范围都在[0,255]之间。
一般情况下,在RGB色彩空间中,图像通道的顺序是R-G-B,即第一通道式R,红色,第二个通道是G,绿色,第三个通道是B,蓝色。然而在OpenCV中通道的顺序是B-G-R,即蓝色--绿色--红色。

像素处理

像素是图像构成的基本单元,像素处理是图像处理的基本操作,可以通过位置索引的形式对图像内得元素进行访问、处理。

二值图像及灰度图像

在OpenCV中最小的数据类型时无符号的8位数。因此,在OpenCV中实际上没有二值图像这种数据类型,二值图像经常是通过处理得到的,使用0表示黑色,使用255表示白色。可以理解为一种特殊的灰度图像。

彩色图像

RGB模式的彩色图像在读入OpenCV内进行处理时,会按照行方向依次读取该RGB图像的B通道、G通道、R通道的像素点,并将像素点以单位储存在ndarray的列中。

使用numpy.array访问像素

numpy.array提供了item()和itemset()函数来访问和修改像素值,而且这两个函数都是经过优化处理的,能够更大幅度地提高处理效率。唉访问及修改像素点值时,利用numpy.array提供的函数比直接使用索引要快得多,同时,他们也有更好的可读性。

二值图像及灰度图像

可以将二值图像理解为特殊的灰度图像,所以这里仅以灰度图像为例讨论像素点值得读取和修改。
函数item()能够更加高效地访问图像的像素点,该函数的语法格式为:
item(行,列)
函数itemset()可以用来修改像素值,其语法格式为:
itemset(索引值,新值)
其中索引值是一个元组——(行,列)

彩色图像

我们可以使用item()和函数itemset()来访问和修改彩色图像的像素值,过程与操作灰度图像相似,不同之处在于需要补充通道信息。
item(行,列,通道)
itemset(三元组索引值,新值)
注意:针对RGB图像的访问,必须必须同时指定行、列以及索引通道。仅仅指定行和列是不可以的。

感兴趣区域ROI

在图像处理过程中,我们可能会对图像某个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest,ROI)。在设定感兴趣区域ROI后,就可以对该区域进行整体操作。例如进行赋值,复制。
ROI表达式如下:
img[200:400,200:400]

通道操作

拆分通道
通过索引拆分通道

通过索引的方式,可以直接将各个通道从图像内提取出来。例如,针对OpenCV内的BGR图像img,如下语句分别从中提取了B通道、G通道、R通道。

b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
通过函数拆分

函数cv2.split()能够拆分图像的通道。例如,可以通过如下语句拆分彩色BGR图像img,得到B通道图像b、G通道g和R通道图像r

b = cv2.split(a)[0]
g = cv2.split(a)[1]
r = cv2.split(a)[2]
通道合并

通道合并是通道拆分的逆过程,通过合并通道可以将三个通道的灰度图像构成一幅彩色图像。函数cv2.merge可以实现图像通道合并,例如将有B通道图像b、G通道图像g和R通道图像r,使用函数cv2.merge()可以将三个通道合并为一幅BGR的三通道彩色图像。其语句为:
brg = cv2.merge([b,g,r])

获取图像属性

在图像处理过程中,经常需要获取图像的属性,例如图像的大小、类型等。这里介绍几个常用的属性。

  • shape: 如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一幅图像识灰度图像(或二值图像)还是彩色图像。

  • size: 返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。

  • dtype: 返回图像的数据类型。

如下例,提取一幅图像内得肤色部分:

import cv2
img = cv2.imread("lesson2.jpg")
hav = cv2.cvtColor( img, cv2.COLOR_BGR2HSV )
h , s, v, = cv2.split(hsv)
minHue = 5
maxHue = 170
hueMask = cv2.inRange(h, minHue, maxHue)
minSat = 25
maxSat = 166
satMask = cv2.inRange( s, minSat, maxSat)
mask = hueMask & satMask
roi = cv2.bitwise_and( img, img, mask= mask)
cv2.imshow("img",img)
cv2.imshow("ROI",roi)
cv2.waitKey()
cv2.destroyALLWindows()
 
 

声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值