opecv图像处理之图像基本操作、图像的算术运算

0814

九、图像的基本操作

1、图像像素的获取与修改

9-10图像基本操作、图像的算术运算
 

首先可以通过图像是三维矩阵的特点读取

注意img[100][100] 和img[100,100] 是一样的效果,同时可以通过直接赋值修改

要获取到某个通道的值,那么,就要确定第三维bgr 分别对应 0 1 2

另一个是调用函数array.item(100,100,1) 具体到第三维得到某个通道的值

调用 array.itemset((100,100,1),value) 设置某通道的值

2、图片的信息

9-10图像基本操作、图像的算术运算
 

Img.shape #  返回含有3个数的元组,分别是 rows cols channel

如果是灰度图像,就没有第三个值,所以可以通过这个来区分是否为彩色图片

Img.size  # 会返回的是总的像素个数,rows * cols *channel

Img.dtype # 返回数据类型

3. 通道的分离与合并

9-10图像基本操作、图像的算术运算
 

调用cv2.split(img) 函数,返回值为b g r 三个通道的图像

合并调用cv2.merge([r,g,b]) # 注意参数是一个含有3个通道的列表

4、感兴趣区域ROI

9-10图像基本操作、图像的算术运算
 

 

这里实现的是在picture窗口选出自己喜欢的区域,在另一窗口显示

要注意的地方,就是鼠标时间返回的x 对应的是列,y 对应的是行

所以选区域是是 img [iy:jy ,ix: jx]  而不是img [ix:jx,iy:jy]

(ix,iy) 为矩阵的左上角,(jx,jy) 为矩阵的右下角

5、给图片加边框

 

 

9-10图像基本操作、图像的算术运算
 

主要是有5中边框

函数为:

Cv2.copyMakeBorder(img,top,bottom,left,right,bordertype,[color])

Img : 图片

Top,bottom,left,right : 分别是上下左右边框的宽度,单位为px

Bordertype有一下几种:

cv2.BORDER_CONSTANT  #constant 常量,就是一个纯色边框,一定要传最后一个参数color进去,其他边框类型不用

Cv2.BORDER_REFLECT  # reflect  镜面对称,就是把边界作镜面对称形成边框

Cv2.BORDER_REFLECT_101  # 和reflect 差不多

Cv2.BORDER_WRAP # 对边界进行镜面对称,而且上下交换,左右交换

Cv2.BORDER_REPLICATE # replicate 对边界进行扩充

十、图像上的算术运算

1、图像的加法

9-10图像基本操作、图像的算术运算
 

前提:两张图片大小类型相同

Cv2.add(img1,img2) 就是每个像素值相加,超过255,取255,否则取相加值

也叫饱和操作(一般用这个比较好)

Img1 + img2  大于定于256的值,对256取余,否则去相加值

2、图像混合

这里我加了滑动条

9-10图像基本操作、图像的算术运算
 

关键函数:cv2.addWeighted(img1,k,img2,1-k,r)

效果是这样的;

Dst = k*img1 + (1-k)*img2 + r

这里r取值为0

K : 0 ——> 1 ,所以随着k的变化,图片会有中透明的感觉

就是img1 和 img2 按比例 k : 1-k 混合

3、图像的按位运算

 9-10图像基本操作、图像的算术运算


9-10图像基本操作、图像的算术运算

提取这个标志,到confu2.jpg 图片里面

这里用到掩模技术和利用阈值把图片二值化

首先还是提取出和logo 一样大小的图片,即roi

把logo 变为灰度图像,因为阈值函数处理的图片为单通道的

Cv2.threshold(grayimg,threshold,maxvalue,thresholdtype)

Grayimg: 要处理的灰度图像

Threshold:阈值 和后面的thresholdtype 有关

Maxvalue : 最大值,和后面的thrsholdtype 有关

CV_THRESH_BINARY

如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0;

CV_THRESH_BINARY_INV

如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.

CV_THRESH_TRUNC

如果 src(x,y)>threshold,dst(x,y) = max_value; 否则dst(x,y) = src(x,y).

CV_THRESH_TOZERO

如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否则 dst(x,y) = 0。

CV_THRESH_TOZERO_INV

如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y).

 

ret,mask = cv2.threshold(logo_gray,20,255,cv2.THRESH_BINARY_INV)

#灰度中比较亮变成黑色作为掩模  灰度较亮的地方(提取目标)为黑色

#处理要提取的颜色相对亮一些时

img1 = cv2.bitwise_and(roi,roi,mask=mask)

所以这个函数返回的是一个黑白图片,为了取出图片的标志,就是除了黑色的部分,所以,我们要把标志部位变为黑色,其他为白色。即大于20的,修改像素值为0,再与roi相与,就留出了图片标准的位置,别的保留

img2 = cv2.bitwise_and(logo,logo,mask=mask_inv)

同样的道理,对mask取反,就标志部位为白色,与logo相与,就得到标志

dst = cv2.add(img1,img2)  

最后两者相加,就是一个插入标志的图片了。

关于cv2.bitwise_and(img,img,dst=dst,mask = mask)

原型是有四个参数的,所以省了第三个时,第四个要明显写出mask = 这个,不能省略

当然,本次的掩模,可以换一个方式

ret,mask = cv2.threshold(logo_gray,20,255,cv2.THRESH_BINARY)

阈值类型改变

img1 = cv2.bitwise_and(roi,roi,mask=mask_inv)

img2 = cv2.bitwise_and(logo,logo,mask=mask)

道理很简单,自己想

 

猜你喜欢

转载自blog.csdn.net/weixin_42973678/article/details/84879910