内容来自OpenCV-Python Tutorials 自己翻译整理
目标:
获取像素值并修改
获取图像属性
设定图像区域
分割和拼接图像
上面内容和python中的numpy库操作有重要联系,熟练使用numpy库很重要
获取像素值并修改
获取图像值可以通过行列的坐标获取,对于一个BGR图像则返回一个BGR值,对于一个灰度图像则返回它的灰度值
import cv2
import numpy as np
img=cv2.imread('2.jpg')
px = img[50,50]
print(px)
px = img[50,50,0]#获取blue值
print(px)
px = img[50,50,1]#获取green值
print(px)
px = img[50,50,2]#获取red值
print(px)
img[50,50] = [255,255,255]
print(img[50,50])
在处理图像的过程中,逐个点像素运算非常耗时,尽量使用矩阵运算。
上述方法通常用来选取矩阵的一个区域,对于图像中的像素处理,使用array.item() 和array.itemset()函数更好,但是返回值
import cv2
import numpy as np
img=cv2.imread('2.jpg')
print(img[10,10])
sca=img.item(10,10,0)#获取bgr值
print(sca)
sca=img.item(10,10,1)
print(sca)
sca=img.item(10,10,2)
print(sca)
img.itemset((10,10,2),100)#给像素赋值
获取图像属性
图像属性包括行数、列数、通道、图像数据类型、像素数等等
img.shape可以返回图像的基本信息
import cv2
import numpy as np
img=cv2.imread('2.jpg')
print(img.shape)
分别是行数、列数、通道数
如果是灰度图像只返回行数和列数 img.size返回图像的像素数 img.dtype返回图像的数据类型
由于python中经常出现数据不一致的情况,所以dtype函数很有用 图像ROI
有时需要找到图片中特定区域的位置,例如在图片中寻找眼睛,首先要找到人脸,然后再找眼睛 ROI是使用numpy下标获取的,此处选择球的部分并把球拷贝到另一个图片当中
复制好的结果 import cv2 import numpy as np
img=cv2.imread('2.jpg') ball = img[280:340, 330:390] img[273:333, 100:160] = ball 分割和合并图像通道 图片的BGR通道可以被分割成单个的通道,对于每个单个的通道可以合并到一起,再次组成BGR 分割
b,g,r = cv2.split(img)
或者使用python中的切片
b = img[:,:,0]#获取蓝色部分 注意split比较耗时 为图像添加边界(填充)
如果想给图片添加一个边界,类似相框一样,可以使用cv2.copyMakeBorder() 函数
但是这个功能还有更多的利用价值,例如卷积运算或者0填充等等
参数如下: - src - 输入图片
- top,bottom,left,right - 边界的像素数目
- borderType - 添加的边界类型,有如下选,cv2.BORDER_CONSTANT 添加有颜色的常量值边界,还需要增加一个参数 value; cv2.BORDER_REFLECT 边界元素镜像,例如
fedcba|abcdefgh|hgfedcb;cv2.BORDER_REFLECT_101 或者 cv2.BORDER_DEFAULT,和上面类似, 但是有少许改变gfedcb|abcdefgh|gfedcba;cv2.BORDER_REPLICATE 重复最后一个元素,例如aaaaaa|abcdefgh|hhhhhhh;cv2.BORDER_WRAP (作者不知道怎么表达)例如cdefgh|abcdefgh|abcdefg - value 边界颜色,如果边界的类型是cv2.BORDER_CONSTANT
样例代码 import cv2 import matplotlib.pyplot as plt import numpy as np
BLUE = [255,0,0]
img1 = cv2.imread('2.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.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE') plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT') plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101') plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP') plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show() 原图:
结果如下图所示:
matplotlib绘制,顺序是RGB,蓝色和红色调换
|