opencv-python(5):图像基本操作

来源:互联网 发布:傲剑洗髓升级数据大全 编辑:程序博客网 时间:2024/05/23 11:42

本节记录五点:获取像素值并将其修改;获取图像的属性;图像的ROI;图像通道的拆分及合并;填充边界

1.1 获取图像的像素

代码:

import numpy as npimport cv2img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',cv2.IMREAD_COLOR)ht=img[50,50]print(ht)hc=img[50,50,0]#获得blue通道值print(hc)hc=img[50,50,1]#获取green通道值print(hc)hc=img[50,50,2]#获取red通道值print(hc)img[50,50]=(0,0,255)print(img[50,50]
1.2修改图像的像素

我们将会用到array.item(),以及array.itemset()两个函数,分别用于获取B,G,R的值,及修改它们的值。

代码:

import numpy as npimport cv2img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',cv2.IMREAD_COLOR)print(img[50,50])print(img.item(50,50,2))img.itemset((50,50,2),254)#给red通道重新赋值print(img[50,50])

2、获取图像的属性

图像的属性包括:行、列、通道以及图像数据类型,像素数目等

img.shape 可以获得图像的形状。它的返回值是一个包含行数、列数以及通道数的元祖。

代码:

import numpy as npimport cv2img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',cv2.IMREAD_COLOR)print(img.shape
结果(312,500,3)
如果是灰度图的话,仅返回行数和列数

img.size 可以获得像素的数目。

代码:

import numpy as npimport cv2img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',cv2.IMREAD_COLOR)print(img.size
结果:468000

img.dtype返回图像数据类型。

代码:

import numpy as npimport cv2img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',cv2.IMREAD_COLOR)print(img.dtype)
结果:uint8

3.图像ROI

ROI使用Numpy索引来获得,我们选择头的部分并将其拷贝到其他地方。

代码:

import numpy as npimport cv2#img=cv2.imread('C:\\Users\\WLX\\Desktop\\3.jpg',0)#显示灰色照片#img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',cv2.IMREAD_GRAYSCALE)#显示黑白照片img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',cv2.IMREAD_COLOR)#显示彩色照片dss=img[49:160,336:449]img[200:311,386:499]=dsscv2.imshow('image',img)cv2.waitKey(0)cv2.destroyAllWindows(
结果:

而如何找到头的位置呢?

我们可以使用ginput()函数实现。

代码:

from PIL import Imagefrom pylab import*im=array(Image.open('C:\\Users\\WLX\\Desktop\\2.jpg'))imshow(im)print('点击三下')x=ginput(3)#鼠标取三个点,并得到我们想要的点的值print('你点了',x)show()
4、拆分并合并图像通道
有时候我们需要对三个通道分别操作,这时便需要将通道分别拆分,有时需要对通道合并。

代码:

b,g,r=cv2.split(img)#拆分通道img=cv2.merge(b,g,r)#合并通道
但split比较费时,如果我们要得到某一通道的值可以用
img[:,:,2]#红色通道值
5、为图像填充边界

如果你想为图片加一个“边框”,你可以使用cv2.copyMakeBorder()函数。它经常在卷积运算或者0填充时被用到。这个函数有如下参数

cv2.copyMakeBorder(src,top,bottom,left,right,borderType,value)

src 输入图像

top,bottom,left,right对应边界的像素数目

BORDER_REFLICATE     # 直接用边界的颜色填充, aaaaaa | abcdefg | ggggBORDER_REFLECT      # 倒映,abcdefg | gfedcbamn | nmabcdBORDER_REFLECT_101   # 倒映,和上面类似,但在倒映时,会把边界空开,abcdefg | egfedcbamne | nmabcdBORDER_WRAP       # 额。类似于这种方式abcdf | mmabcdf | mmabcdBORDER_CONSTANT    # 常量,增加的变量通通为value色 [value][value] | abcdef | [value][value][value]
value:仅仅是常量型边界才有意义

代码:

import cv2import matplotlib.pyplot as pltimport numpy as npBLUE = [255,0,0]img1 = cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',cv2.IMREAD_COLOR)replicate = cv2.copyMakeBorder(img1,20,20,20,20,cv2.BORDER_REPLICATE)reflect = cv2.copyMakeBorder(img1,20,20,20,20,cv2.BORDER_REFLECT)reflect101 = cv2.copyMakeBorder(img1,20,20,20,20,cv2.BORDER_REFLECT_101)wrap = cv2.copyMakeBorder(img1,20,20,20,20,cv2.BORDER_WRAP)constant= cv2.copyMakeBorder(img1,20,20,20,20,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()
结果:





原创粉丝点击