OpenCV零基础入门(3):ROI区域|颜色通道提取|边界填充|图像融合|图像阈值

本文主要内容如下:

  • 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()函数拆分图像的通道,显示出来都是灰色的。因为只有一个色彩通道,当灰度图处理了。
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)

运行结果如图所示:
在x轴放大三倍

5.图像阈值

函数原型:ret, dst = cv2.threshold(src, thresh, maxval, type)

  • ret:True or False 代表有没有读到图片
  • dst:输出图
  • src: 输入图,只能输入单通道图像,通常来说为灰度图
  • thresh:阈值(0-255之间的值,比如说127)
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • type:二值化操作的类型,包含以下5种类型:
  • 1.cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
  • 2.cv2.THRESH_BINARY_INV #THRESH_BINARY的反转,低于阈值部分取maxval(最大值),否则取0
  • 3.cv2.THRESH_TRUNC 大于阈值部分取阈值,其余不变
  • 4.cv2.THRESH_TOZERO 大于阈值部分不改变,其余设为0
  • 5.cv2.THRESH_TOZERO_INV #THRESH_TOZERO的反转
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('./img/dog.png')
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,thresh1=cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(gray_img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(gray_img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(gray_img,127,255,cv2.THRESH_TOZERO_INV)

titles=['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images=[img,thresh1,thresh2,thresh3,thresh4,thresh5]
for i  in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()


运行结果如图所示:
图像阈值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值