0814
九、图像的基本操作
1、图像像素的获取与修改
首先可以通过图像是三维矩阵的特点读取
注意img[100][100] 和img[100,100] 是一样的效果,同时可以通过直接赋值修改
要获取到某个通道的值,那么,就要确定第三维bgr 分别对应 0 1 2
另一个是调用函数array.item(100,100,1) 具体到第三维得到某个通道的值
调用 array.itemset((100,100,1),value) 设置某通道的值
2、图片的信息
Img.shape # 返回含有3个数的元组,分别是 rows cols channel
如果是灰度图像,就没有第三个值,所以可以通过这个来区分是否为彩色图片
Img.size # 会返回的是总的像素个数,rows * cols *channel
Img.dtype # 返回数据类型
3. 通道的分离与合并
调用cv2.split(img) 函数,返回值为b g r 三个通道的图像
合并调用cv2.merge([r,g,b]) # 注意参数是一个含有3个通道的列表
4、感兴趣区域ROI
这里实现的是在picture窗口选出自己喜欢的区域,在另一窗口显示
要注意的地方,就是鼠标时间返回的x 对应的是列,y 对应的是行
所以选区域是是 img [iy:jy ,ix: jx] 而不是img [ix:jx,iy:jy]
(ix,iy) 为矩阵的左上角,(jx,jy) 为矩阵的右下角
5、给图片加边框
主要是有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、图像的加法
前提:两张图片大小类型相同
Cv2.add(img1,img2) 就是每个像素值相加,超过255,取255,否则取相加值
也叫饱和操作(一般用这个比较好)
Img1 + img2 大于定于256的值,对256取余,否则去相加值
2、图像混合
这里我加了滑动条
关键函数: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、图像的按位运算
提取这个标志,到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)
道理很简单,自己想