Python-初学openCV——图像预处理(三)

目录

一、边缘填充

1、边界复制

2、边界反射

3、边界反射101

4、边界常数

5、边界包裹

二、透视变换

三、图像掩膜

1、制作掩膜

2、与运算

3、颜色替换

四、ROI切割

五、图像添加水印


一、边缘填充

我们对图像进行处理后,需要对空出来的区域进行一个填充,此外、后续的一些图像处理方式也会用到边缘填充

(下面例子会在插值方法后继续操作)

1、边界复制

python 复制代码
cv2.BORDER_REPLICATE

边界复制会将边界处的像素值进行复制,然后作为边界填充的像素 值,如左图所示,可以看到四周的像素值都一样


2、边界反射

python 复制代码
cv2.BORDER_REFLECT

如左图所示,会根据原图的边缘进行反射


3、边界反射101

python 复制代码
cv2.BORDER_REFLECT_101

与边界反射不同的是,不再反射边缘的像素点,如左图所示


4、边界常数

python 复制代码
cv2.BORDER_CONSTANT

当选择边界常数时,还要指定常数值是多少,默认的填充常数值 为0,如左图所示


5、边界包裹

python 复制代码
cv2.BORDER_WRAP

如左图所示


二、透视变换

透视变换就是图像矫正,是把一个图像投影到一个新的视平面的过程, 通俗的讲,透视变换的作用其实就是改变一下图像里的目标物体的被观察的视角

python 复制代码
M=getPerspectiveTransform(src,dst)

src:原图像上需要进行透视变化的四个点的坐标,这四个点用于定义一个原图中的四边形区域

dst:透视变换后,src的四个点在新目标图像的四个新坐标

该函数会返回一个透视变换矩阵,得到透视变化矩阵之后,使用**warpPerspective()**函数即可进行透视变化计算,并得到新的图像

python 复制代码
cv2.warpPerspective(img, M, dsize, flags, borderMode)

img:输入图像。

M:透视变换矩阵。这个矩阵可以通过getPerspectiveTransform函数计算得到。

dsize:输出图像的大小。它可以是一个Size对象,也可以是一个二元组。

flags:插值方法的标记。

borderMode:边界填充的模式

三、图像掩膜

掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改

1、制作掩膜

python 复制代码
mask=cv.inRange(img,color_low,color_high)

左图是HSV每个颜色的最大最小值

2、与运算

当两个命题都是真时,其结果才为真。而在图像处理中,"与"运算被用来对图像的像素值进行操作,掩膜中有很多地方是黑色的,其像素值为0,那么在与原图像进行"与"运算的时候,得到的新图像的对应位置也是黑色的

(任何值与上0(黑) 都等于0,任何值与上1(白) 都等于这个值本身)

python 复制代码
cv2.bitwise_and(src1,src2[,mask])

src2第一个输入数组。通常是输入的原始图像

src2 :第二个输入数组。它可以是另一个图像、一个常数值或者与 src1 相同的图像

a. 当应用掩膜时,这个参数经常就是src1本身;即对同一个图像进行操作

b. 如果对两个不同的图像执行按位与操作(例如,将两张图片的某些部分组合在一起),可 以分别将它们作为 src1src2 输入到 cv2.bitwise_and() 函数中,创建复杂的图像效果 或进行图像合成

mask :掩膜(可选)。输入数组元素只有在该掩膜非零时才被处理。是一个8位单通道的数组,尺寸必须与src1src2相同

返回值:输出数组,应用掩膜后的图像,与输入数组大小和类型相同

3、颜色替换

由于掩膜与原图的大小相同,并且像素位置一一对应,那么我们就可以得到掩膜中白色(也就是像素值为255)区域的坐标,并将其带入到原图像中,然后就可以修改像素值了,这样就完成了颜色的替换

四、ROI切割

ROI:Region of Interest,翻译过来就是感兴趣的区域,就是通过切片实现,对图像局部操作

五、图像添加水印

添加水印的概念其实可以理解为将一张图片中的某个物体或者图案提取出来,然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图,并进行二值化处理,去除背景部分,得到一个类似掩膜的图像。然后将这个二值化图像与另一张图片中要添加水印的区域进行"与"运算,使得目标物体的形状出现在要添加水印的区域。最后,将得到的目标物体图像与要添加水印的区域进行相加,就完成了添加水印的操作。这样可以实现将一个图像中的某个物体或图案叠加到另一个图像上,从而实现添加水印的效果

(在roi切片区域的修改是直接在原图上修改的,指向的是同一内存地址)