OpenCV图像基础操作与算术操作
分类:
文章
•
2025-05-07 18:44:28
- 图像的基础操作
- 1、ROI
- ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。使用ROI圈定你想读的目标,可以减少处理时间,增加精度。
- 2、获取图像属性
- 图像的属性包括
- 行,列,通道:img.shape
- 图像数据类型: img.dtype
- 像素数目:img .size
- 3、拆分及合并图像通道
- 拆分通道:b,g,r = cv2.split(img)
- 合并通道:cv2.merge((b,g,r))
- 4、图像填充边界
- 创建一个类似相框的边界,这经常在卷积运算或者0填充时使用
- cv2.copyMakeBorder( src, top, bottom, left, right, borderType, value)
- src : 输入图像
- top, bottom, left, right:对应边界的像素数目
- borderType: 添加哪种类型的边界
- cv2.BORDER_CONSTANT 添加有????色的常数值边界,还需要添加下一个参数(value)。
- cv2.BORDER_REFLECT 边界元素的镜像
- cv2.BORDER_WRAP
- value: 边界颜色,类似(255,255,255)
- 实例


- 图像的算术操作
- 1、图像加法: 图像加法,实际上就是矩阵的加法,即矩阵内不元素相加。


- 2、图像混合:图像混合不同于图像相加,这种操作会给每幅图片一个权重,达到一种混合或者透明的效果。可以根据 g(x)=(1-¢)·f 1+ ¢·f2,即有dst = a·img1 + b·img2 +c, 一般c取0即可。
- cv2.addWeighted(img1,a,img2,b,c)


- 3、按位操作,可以用来添加标签,logo之类的操作。
- 一般的位操作有:AND,OR,NOT,XOR等。
- 首先选取两张图,一张作为背景图,另外一张作为标签图。

- 然后选取ROI区域。

- 接下来就是图像二值化。
- 其中用到了 cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst,其中几个参数需要注意下,
- src:表示的是图片源,只能输入单通道图像,通常来说为灰度图
- thresh:表示的是阈值(起始值)
- maxval:表示的是最大值
- type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)

- cv2.bitwise_not(mask):将图片的像素取反,即0变为255,255变为0。
- cv2.bitwise_and(roi, roi, mask=mask) 和 cv2.bitwise_and(img1, img1, mask=mask_inv)
- roi/img1:图像矩阵1
- roi/img1:图像矩阵2
- mask:掩膜,默认选项
- 下图即二值化操作。

- 最后,将两组矩阵相加,得到结果如下。


- 图像阀值
- 简单阀值- cv2.threshhold(grayimg, thres, res-thres, flag)
- 这个函数的第一个参数就是原图的灰度图。第二个参数就是用来对像素值分类的阀值。第三个参数就是当像素值高于(有时是小于)阀值时应给予的新的像素值。OpenCV提供了多种不同的阀值方法由第四个参数来决定的,一般包括cv2.THRESH_BINARY,cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV
- 自适应阀值
- 使用是全局阀值时整幅图像用同一个数作为阀值。但是这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们就需要用自适应阀值。此时的阀值是根据图像上的每一个小区域计算与其对应的阀值。因此在同一幅图像上的不同区域采用的是不同的阀值,从而使我们能在亮度不同的情况下得到更好的结果。这种情况下需要指定三个参数,返回一个结果。
- cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2)
- Adaptive Method- 指定计算阀值的方法。
- cv2.ADPTIVE_THRESH_MEAN_C:阀值取自相邻区域的平均值
- cv2.ADPTIVE_THRESH_GAUSSIAN_C:阀值取值相邻区域的加权和,权重为一个高斯窗口。
- Block Size - 邻域大小(用来计算阀值的区域大小)。
- C - 就是一个常数,阀值就等于平均值或者加权平均值减去这个常数。