欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-26 11:25:08
...

说明

  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)

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


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)

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

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)

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