OpenCV_Python官方文档6——基于numpy数组的图像操作

版权声明:本文为博主原创文章,欢迎转载,但未经作者同意必须保留此段声明,版权所有翻版必究。 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,对于灰度图则返回灰度值。

主要函数

  1. 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 *点击此处

  1. 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

获取图像属性

包括图像的高、宽、颜色通道数、图像数据类型、像素数目等。

主要函数

  1. img.shape:获取图片的高、宽、颜色通道数
  2. img.size:返回图像的像素数目
  3. 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数组来分离通道。

主要函数

  1. b, g, r = cv2.split(img):返回BRG三个通道
  2. 只返回其中一个通道:
b = cv2.split(img)[0]
g = cv2.split(img)[1]
r = cv2.split(img)[2]
  1. 直接操作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
  1. 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')

运行结果如下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_38814578/article/details/83107623