版权声明:本文为博主原创文章,欢迎转载,但未经作者同意必须保留此段声明,版权所有翻版必究。 https://blog.csdn.net/sinat_38814578/article/details/83107623
OpenCV-Python Tutorials
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
获取并修改像素值
读取一张图片,根据像素点的行和列的坐标获取它的像素值,对于BGR模式的图片,返回数组对应的值为BGR,对于灰度图则返回灰度值。
主要函数
img[row,col]
:直接通过行列坐标来访问图像像素值
from imutils import *
#设置工作路径
import os #导入os模块
os.chdir('C:/Users/lenovo/Pictures/')
img = imread('flowers.jpg')
#show(img)
(b,g,r) = img[100,100] #获得(100,100)处的对应的BGR值
print(img[100,100])
b = img[100,100,0] #获得(100,100)处的对应的B的值
print(b)
img[101,101] = 255 #将(101,101)处的像素点设为白色
print(img[101,101])
想了解上面的代码
from imutils import *
点击此处
img.item()
和img.itemset()
:
第一种方式是非常缓慢的,推荐使用Numpy函数进行访问和设置
print(img.item(10,10,2)) #252
img.itemset((10,10,2),100)
print(img.item(10,10,2)) #100
获取图像属性
包括图像的高、宽、颜色通道数、图像数据类型、像素数目等。
主要函数
img.shape
:获取图片的高、宽、颜色通道数img.size
:返回图像的像素数目img.dtype
:返回图像的数据类型,在处理debug时很重要,因为OpenCV-Python中大量的错误是由于无效的数据类型导致的。
print(img.shape) #分别获得图像的高、宽、颜色通道数
print("height: %d pixels" % (img.shape[0]))
print("width: %d pixels" % (img.shape[1]))
print("channels: %d pixels" % (img.shape[2]))
#(2160, 3840, 3)
#height: 2160 pixels
#width: 3840 pixels
#channels: 3 pixels
print(img.size) #图像像素数目:24883200
print(img.dtype) #图像数据类型:uint8
原图片的高度、宽度如下:(点击此处查看对于图像高宽及坐标的解释)
在所加载的图像上创建感兴趣区域(Image ROI)
将图片右下角拷贝到左上角,并且右上角变成纯蓝色。
(h,w,c) = img.shape #高、宽、颜色通道数
cX,cY = (w//6,h//6)
flower = img[h-cY:h,w-cX:w] #截取图像的右下角
show(flower)
img[0:cY,0:cX] = flower #将截取的图像拷贝到图像的左上角
show(img)
img[0:cY,w-cX:w]=(0,255,255) #将图像的右上角变成蓝色
show(img)
运行结果如下:(点击此处查看对于图像处理时的坐标转换的解释)
分离及合并图像通道
有时需要对BRG三个颜色通道分别操作,这就需要分离BRG为单个通道;有时需要把独立通道的图片合成一张有BRG三个通道的图片。可以使用OpenCV自带的split函数,也可以直接操作Numpy数组来分离通道。
主要函数
b, g, r = cv2.split(img)
:返回BRG三个通道- 只返回其中一个通道:
b = cv2.split(img)[0]
g = cv2.split(img)[1]
r = cv2.split(img)[2]
- 直接操作Numpy数组
'''
b = np.zeros((img.shape[0],img.shape[1]),dtype=img.dtype)
g = np.zeros((img.shape[0],img.shape[1]),dtype=img.dtype)
r = np.zeros((img.shape[0],img.shape[1]),dtype=img.dtype)
'''
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
如果想要所有红色通道值都为0,不必分离通道数再赋值,可以使用Numpy数组操作
img[:,:,2]=0
img = cv2.merge([b,r,g])
:合并通道数
cv2.split()
耗时长,不是必须的情况尽量使用Numpy
给图片添加边框(padding)
在卷积运算或0填充时被用到。例如用3×3的核对一张6×6的图像进行卷积,得到的是4×4的图像,得到的图像缩小了。可以把原图扩充一圈,再卷积,这个操作叫padding。
主要函数
cv2.copyMakeBorder()
src
:要处理的原始图像top, bottom, left, right
:上下左右对应边界要扩展的像素数目borderType
:边框类型/填充方式cv2.BORDER_CONSTANT
:固定值填充,即边框都填充成一个固定值。使用该填充方式时,函数还需要一个参数–固定值,确定填充颜色(value)。cv2.BORDER_DEFAULT
:默认方式,填充成与原图像边界对称的值。
关于卷积和填充方式的更多图文解释请点击这里
from imutils import *
import os
os.chdir('C:/Users/lenovo/Pictures/')
img = imread('flowers.jpg')
blue = [0,0,255] #matplotlib的颜色模式为RGB
constant = cv2.copyMakeBorder(img,400,400,400,400,cv2.BORDER_CONSTANT,value=blue)
default = cv2.copyMakeBorder(img,400,400,400,400,cv2.BORDER_DEFAULT)
replicate = cv2.copyMakeBorder(img,400,400,400,400,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,400,400,400,400,cv2.BORDER_REFLECT)
wrap = cv2.copyMakeBorder(img,400,400,400,400,cv2.BORDER_WRAP)
plt.subplot(231),plt.imshow(img,'gray'),plt.title('original')
plt.subplot(232),plt.imshow(constant,'gray'),plt.title('constant')
plt.subplot(233),plt.imshow(replicate,'gray'),plt.title('default')
plt.subplot(234),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(235),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(236),plt.imshow(wrap,'gray'),plt.title('wrap')
运行结果如下: