OpenCV-Python 图像处理(三):图像的基本操作

说明

  1. 本系列主要是学习OpenCV-Python文档的个人笔记。
  2. 很少有理论的叙述,都是函数名、参数描述、作用、应用场景、代码、效果图。简单明了,即学即用。

1、获取并修改像素值

函数:img[] #不严格
参数:无
作用:如题
应用场景:不知道怎么描述,你懂得。

import cv2

img=cv2.imread('F:\\temp\\color.jpg')

px=img[180,180] #图像是个矩阵,所有通道的第180行,180列的像素值
print(px)
blue=img[180,180,2] #第三通道(B通道)的第180行,180列的像素值
print(blue)

这里写图片描述


img[180,180]=[255,255,255] #修改像素值,3个通道的都改了
print(img[180,180])
## [255 255 255]

2、图像 ROI

函数:img[] #不严格
参数:无
作用:对一幅图像的特定区域进行操作
应用场景:举个栗子,检测一副图像眼睛位置时,先找脸,再基于脸(ROI)找眼睛,而不是基于整幅图像找眼睛,这样可以提高程序的准确性和性能。

代码如下(可复制):

import cv2

img=cv2.imread('F:\\temp\\color.jpg')

roi=img[180:260,320:400] #长80,宽80
img[177:257,120:200]=roi #长80,宽80
img=cv2.imshow('test', img) 
cv2.waitKey(0)

效果图如下:
这里写图片描述

3、拆分及合并图像通道

函数:cv2.split() , cv2.merge()
参数:图像矩阵变量
作用:如题
应用场景:不知道怎么描述,你懂得。

代码如下(可复制):

img=cv2.imread('F:\\temp\\color.jpg')
r,g,b=cv2.split(img)  #拆分
img=cv2.merge(r,g,b)  #合并

#或者

r=img[:,:,0]  
g=img[:,:,1]
b=img[:,:,2]

#假如你想使所有像素的红色通道值都为 0,你不必先拆分再赋值。你可以直接使用 Numpy 索引,这会更快。
img[:,:,0]=0

警告:cv2.split() 是一个比较耗时的操作。只有真正需要时才用它,能用Numpy 索引就尽量用。

4、为图像扩边(填充)

函数:cv2.copyMakeBorder()
参数:• src 输入图像
  • top, bottom, left, right 对应边界的像素数目。
  • borderType 要添加哪种类型的边界,类型如下:
    – cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。
    – cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcde-fgh|hgfedcb
    – cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
    – cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa|abcdefgh|hhhhhhh
    – cv2.BORDER_WRAP 像这样: cdefgh|abcdefgh|abcdefg
  • value 边界颜色,前提是边界的类型是 cv2.BORDER_CONSTANT
作用:在图像周围创建一个边,像个相框一样。
应用场景:经常在卷积运算或 0 填充时被用到

代码如下(可复制):


import cv2
from matplotlib import pyplot as plt  #画图用的

BLUE=[0,0,255]

img1=cv2.imread('F:\\temp\\3.jpg')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

#可视化上面的图
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL'),plt.axis('off')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE'),plt.axis('off')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT'),plt.axis('off')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101'),plt.axis('off')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP'),plt.axis('off')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT'),plt.axis('off')
plt.show()


#打印出它们的shape看看是不是在img1的基础上加了10
print(img1.shape,replicate.shape,reflect.shape,wrap.shape,constant.shape)

效果如图:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41196817/article/details/82426603