本文主要内容如下:
- ROI区域
- 颜色通道提取
- 边界填充
- 图像融合
1.截取部分图像数据(ROI区域)
ROI(Region of Interest),即感兴趣区域,是指在图像处理和计算机视觉中,从被处理的图像中以方框、圆、椭圆、不规则多边形等方式勾勒出的需要处理的区域。在机器视觉、图像处理等领域,ROI是一个重要的概念,常用于目标检测、图像分割和物体跟踪等任务中。
import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img=cv2.imread('./img/dog.png')
dog=img[0:200,0:400] #原点为图像左上角的点,截取图像高200个像素点,宽400个像素点
cv_show('dog',dog)
运行结果如图所示:
2.颜色通道提取
OpenCV默认使用BGR(蓝/绿/红)顺序来存储图像的颜色通道。B通道是img[:,:,0],G通道是img[:,:,1],R通道是img[:,:,2]
提取蓝色通道:
img=cv2.imread('./img/dog.png')
img[:,:,1]=0 #G通道关闭
img[:,:,2]=0 #R通道关闭
cv_show('Bdog',img)
运行结果如图所示:
如果使用cv2.split()函数拆分图像的通道,显示出来都是灰色的。因为只有一个色彩通道,当灰度图处理了。
合并三个通道:
Imagebgr=cv2.merge([b,g,r]) #Imagebgr是合并后的图像
3.边界填充
- 边界填充类型(borderType):
- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制。
- BORDER_CONSTANT:常数值填充
import cv2
img=cv2.imread('./img/dog.png')
top_size,bottom_size,left_size,right_size=(50,50,50,50) #上下左右的填充宽度
replicate=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)#复制法填充
reflect=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)#反射法填充
constant=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT)#常数值填充
import matplotlib.pyplot as plt
#plt.subplot(221)表示把显示界面分割成2*2的网格。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号
plt.subplot(221),plt.imshow(img,'gray'),plt.title('ORIGINAL')#原图
plt.xticks([]),plt.yticks([])#隐藏x轴和y轴上的刻度值
plt.subplot(222),plt.imshow(replicate,'gray'),plt.title('REPLICATE')#复制法填充
plt.xticks([]),plt.yticks([])
plt.subplot(223),plt.imshow(reflect,'gray'),plt.title('REFLECT')#反射法填充
plt.xticks([]),plt.yticks([])
plt.subplot(224),plt.imshow(constant,'gray'),plt.title('CONSTANT')#常数值填充
plt.xticks([]),plt.yticks([])
运行结果如图所示:
4.图像融合
import cv2
img_dog=cv2.imread('./img/dog.png')
img_cat=cv2.imread('./img/cat.png')
#将cat.png的height和width修改成跟dog.png一样
img_cat=cv2.resize(img_cat,(523,495))
res=cv2.addWeighted(img_dog,0.6,img_cat,0.4,0) #img_dog的权重0.6,img_cat的权重0.4,两张图片叠加
plt.imshow(res)
运行结果如图所示:
cv2.resize()的另一个用法:在x轴和y轴上分别放缩
res=cv2.resize(img_cat,(0,0),fx=3,fy=1) #x轴放大三倍
plt.imshow(res)
运行结果如图所示: