访问和修改像素值
import cv2 as cv img=cv.imread('./images/lena.jpeg') # 显示某个像素的数据,如果是BGR图像,则返回一个由蓝色、绿色和红色值组成的数组; # 对于灰度图像,只返回相应的灰度 px=img[100,100] print(px) # [ 85 47 131] # 仅访问蓝色像素 blue=img[100,100,0] print(blue) # 85 # 修改像素值 img[100,100]=[255,255,255] print(img[100,100]) # [255 255 255] # 对于单个像素访问,Numpy方法array.item()和array.itemset()被认为更好, # 但是它们始终返回标量。如果要访问所有B,G,R,则需要分别调用所有的array.item()。 # 访问red值 red=img.item(100,100,2) print(red) # 255 # 修改red值 img.itemset((100,100,2),100) print(img.item(100,100,2)) # 100
访问图像属性
图像属性包括行数、列数和通道数,图像数据类型,像素数等。
import cv2 as cv img=cv.imread('./images/lena.jpeg') shape=img.shape # 行数、列数和通道数 size=img.size # 像素数 dtype=img.dtype # 图像数据类型 print("shape:{0},size:{1},dtype:{2}".format(shape,size,dtype))
图像感兴趣区域ROI
使用Numpy索引再次获得ROI
import cv2 as cv img=cv.imread('./images/lena.jpeg') print(img.shape) region=img[100:180,80:100] img[50:130,30:50]=region # 选择感兴趣的区域并复制到图像中的另一个区域 cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows()
拆分和合并图像通道
需要分别处理图像的B,G,R通道。这时将BGR图像拆分为单个通道。
cv.split()方法拆分,cv.merge()方法合并
import cv2 as cv img=cv.imread('./images/lena.jpeg') # 使用cv.split()方法拆分 # b,g,r=cv.split(img) # print(b) # print(g) # print(r) # 使用numpy索引访问 b=img[:,:,0] g=img[:,:,1] r=img[:,:,2] img1=cv.merge((b,g,r)) cv.imshow('img',img1) cv.waitKey(0) cv.destroyAllWindows()
cv.split()是一项耗时的操作(就时间而言)。因此,仅在必要时才这样做。否则使用Numpy索引访问。
为图像设置边框(填充)
cv.copyMakeBorder()在图像周围创建边框(如相框)。
cv.copyMakeBorder(src,top,bottom,left,right,borderType,dst,value)
- src:输入图像
- top,bottom,left,right边界宽度(以相应方向上的像素数为单位)
- borderType:定义要添加哪种边框的标志。
- cv.BORDER_CONSTANT:添加恒定的彩色边框。该值应作为下一个参数给出。
- cv.BORDER_REFLECT:边框将是边框元素的镜像。如:fedcba|abcdefgh|hgfedcb
- cv.BORDER_REFLECT_101或cv.BORDER_DEFAULT与上述相似,如:gfedcb|abcdefgh|gfedcba
- cv.BORDER_REPLICATE:最后一个元素被复制。如:aaaaaa|abcdefgh|hhhhhh
- cv.BORDER_WRAP:cdefgh|abcdefgh|abcdefg
- value:边框的颜色,边框类型为cv.BORDER_CONSTANT
import cv2 as cv from matplotlib import pyplot as plt img=cv.imread('./images/opencv.png') img=img[:,:,[2,1,0]] blue=[255,0,0] # aaaaaa | abcdefgh | hhhhhhh img1=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_REPLICATE) # fedcba | abcdefgh | hgfedcb img2=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_REFLECT) # gfedcb | abcdefgh | gfedcba img3=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_REFLECT_101) # cdefgh | abcdefgh | abcdefg img4=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_WRAP) # 常量值 value img5=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_CONSTANT,value=blue) plt.subplot(2,3,1) plt.imshow(img) plt.title('Original') plt.xticks([]) plt.yticks([]) plt.subplot(2,3,2) plt.imshow(img1) plt.title('Replicate') plt.xticks([]) plt.yticks([]) plt.subplot(2,3,3) plt.imshow(img2) plt.title('Relect') plt.xticks([]) plt.yticks([]) plt.subplot(2,3,4) plt.imshow(img3) plt.title('Reflect_101') plt.xticks([]) plt.yticks([]) plt.subplot(2,3,5) plt.imshow(img4) plt.title('Wrap') plt.xticks([]) plt.yticks([]) plt.subplot(2,3,6) plt.imshow(img5) plt.title('Constant') plt.xticks([]) plt.yticks([]) plt.show()
结果如下:

posted on
浙公网安备 33010602011771号