Opencv 图像操作基础
目录
本节主要学习:
- 获取图像、获取图像某一个像素的取值、并调整它
- 获取图像的属性,比如尺寸等
- 设置ROI(关注区)
- 图像的拆分与重整
本节主要用到 Numpy 而非 Opencv
图像的获取与调整
读取图像:
path = r'.\test1.jpg' #设置路径
import cv2
import numpy as np
img = cv2.imread(path)
我们可以根据像素的行、列索引获取特定的像素,对于BGR图像(Opencv默认将彩色图像按蓝、绿、红读取),它将返回蓝、绿、红三个通道构成的数列。对于灰度图像,将返回该位置对应的像素密度值。
px = img[100,100]
print(px)
#获取蓝色通道的像素值
blue = img[100,100,0]
print(px)
[ 71 92 173]
[ 71 92 173]
我们可以用同样的方法调整像素值
img[100,100] = [255,255,255]
print(img[100,100])
[255 255 255]
提示
由于Numpy模块是为了数列运算开发的,因此单单用来根据索引找寻一个像素点、调整某像素的值不太妥当,因此上述方法实际上并不高效,运行很慢。所以,以上操作只用在获取多个像素点、修改多个像素点的场合。
对于单一像素点的获取与修改,可使用:
img.item(100,100,0)
img.itemset((100,100,0),255)
获取图像的属性
img.shape
Out[8]: (371, 660, 3)
img.size
Out[9]: 734580
img.dtype
Out[10]: dtype('uint8')
其中,shape返回图像的行(高度)、列(宽度)和通道数(彩色图像一般为3通道)
size返回图像的所有像素点的个数
dtype返回图像的类型,一般为uint8。该方法一般用在 debug 的时候,一般图像出错都是因为数据类型的原因。
获取图像的ROI(关注区)
我们可以通过索引直接获取,比如
ROI = img[100:200,100:200]
图像填充边框
If you want to create a border around the image, something like a photo frame, you can use cv2.copyMakeBorder() function. But it has more applications for convolution operation, zero padding etc. This function takes following arguments:
如果你想要在图像周围,创建一个照片边框,那么你可以使用 cv2.copyMakeBorder()函数。一般会在卷积时,给图像填充一个0像边框。cv2.conpyMakeBorder()函数接收一下参数:
src —— 源图像
top、bottom、left、right —— 边框的包含的像素点
borderType —— 定义使用何种填充形式:
- cv2.BORDER_CONSTANT—— 像素为固定值,若是用该值作为参数,则必须紧跟着另一个参数,用以设置像素大小
- cv2.BORDER_REFLECT —— 填充像素为镜像像素,例如fedcba|abcdefgh|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 - 当borderType 选择 cv2.BORDER_CONSTANT 需要用到该参数,用以设置填充像素
实例代码
mport cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255,0,0]
img1 = cv2.imread('opencv_logo.png')
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()