pythonopencv图像_OpenCV图像的基本操作

本文介绍了如何使用Python的OpenCV库进行图像处理,包括获取和修改像素值、图像属性、ROI操作、通道拆分与合并以及图像边界的填充方法。通过实例代码展示了如何利用numpy进行高效矩阵运算,并提供了不同边界填充效果的示例。
摘要由CSDN通过智能技术生成

使用工具Python3.5

使用包cv2,numpy

1.获取并修改像素值

读取一副图像,根据像素的行和列的坐标获取它的像素值,对于RGB图像而言,返回RGB的值,对于灰度图则返回灰度值

~~~

import cv2

import numpy

img = cv2.imread('45.jpg')

px=img[100,100]

print(px)

blue = img[100,100,0]

print(blue)

img[101,101]=[255,255,255]

print(img[101,101])

~~~

numpy是经过优化了的进行快速矩阵运算的包,所以不推荐逐个获取像素值并修改能矩阵运算就不要用循环。

例如前5行的后3列,用numpy的array.item()和array.itemset()会更好。但是返回是标量,如果想获得所有RGB的值,需要使用array.item()分割他们。

更好的方法是

~~~

import cv2

import numpy

img = cv2.imread('45.jpg')

print(img.item(10,10,2))

img.itemset((10,10,2),100)

print(img.item(10,10,2))

~~~

2.获取图像属性

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

2.1 img.shape可以获得图像的形状,返回值是一个包含行数,列数,通道数的元组

~~~

import cv2

import numpy

img = cv2.imread('45.jpg')

print(img.shape)

~~~

如果图像是灰度图,返回值仅有行数和列数,所以通过检查返回值可以判断是灰度图还是彩色图

2.2 img.size可以返回图像的像素数目

~~~

import cv2

import numpy

img = cv2.imread('45.jpg')

print(img.size)

~~~

2.3 img.dtype返回图像的数据类型,在debug时很重要,因为OpenCV-Python代码中经常出现数据类型的不一致

~~~

import cv2

import numpy

img = cv2.imread('45.jpg')

print(img.dtype)

~~~

3.图像ROI

对图像的特定区域操作。ROI是使用numpy索引来获得的。

例:选择球的部分并拷贝到其他区域

![](https://box.kancloud.cn/0e93e1656483b21559045976353106ce_347x212.jpg)

~~~

import cv2

import numpy

img = cv2.imread('roi.jpg')

ball =img[20:30,30:30]

img[40:40,50:50]=ball

~~~

注意!!这里没有找到原图,大家可以试试自己做的图,并且要先知道图像尺寸,以及你要移动的图像的像素坐标,可以使用matplotlib!!

4.拆分及合并图像通道

有时需要对RGB三个通道分别操作,这就需要拆分RGB为单个通道。有时需要把独立的通道的图片合成一个RGB。

~~~

r,g,b=cv2.split(img)#拆分

img=cv2.merge(r,g,b)#合并

~~~

或者

~~~

b=img[:,:,0]#拆分b通道

~~~

假如想使所有红色通道值都为0,不必拆分再赋值,可以使用numpy索引,这样更快

~~~

img[:,:,2]=0

~~~

cv2.split()是比较耗时的操作,能用numpy就尽量使用。

5.为图像扩边(填充)

想为图像周围建一个边可以使用cv2.copyMakeBorder()函数。这经常在卷积运算或0填充时被用到。具体参数如下:

5.1 src输入图像

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

5.3 borderType要添加哪种类型的边界:

5.3.1cv2.BORDER_CONSTANT添加有颜色的常数值边界,还需要下一个参数(value)

5.3.2cv2.BORDER_REFLIECT边界元素的镜像。例如:fedcba | abcdefgh | hgfedcb

5.3.3cv2.BORDER_101或者cv2.BORDER_DEFAULT跟上面一样,但稍作改动,例如:gfedcb | abcdefgh | gfedcba

5.3.4cv2.BORDER_REPLICATE复后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh

5.3.5 cv2.BORDER_WRAP 不知怎么了, 就像样: cdefgh| abcdefgh|abcdefg

5.3.6value边界颜色

举例说明

~~~

import cv2

import numpy

from matplotlib import pyplot as plt

img = cv2.imread('roi.jpg')

blue = [255,0,0]

replicate = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REPLICATE)

reflect = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT)

reflect101 = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT101)

wrap = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_WRAP)

constant = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_CONSTANT,value=blue)

plt.subplot(231),plt.imshow(img,'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('reflect101')

plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')

plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')

plt.show()

~~~

![](https://box.kancloud.cn/d9f90a4c97632fac408c443001209ef2_1162x773.jpg)

大家可以尝试做做自己的图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值