一,图像的基础操作
1,获取并修改像素值
获取(速度比较慢)
px=img[100,100]
print px
blue=img[100,100,0]
print blue
修改
img[100,100]=[255,255,255]
print img[100,100]
另一种更好的方法(使用numpy)速度会更快
print img.item(10,10,2)
img.itemset((10,10,2),100)
print img.item(10,10,2)
2,获取图像的属性
img.shape 行列通道
img.size 像素数目
img.dtype 数据类型
注释:常用编码 # -*- coding: utf-8 -*-
3,图像ROI
ball=img[280:340,330:390]
img[273:333,100:160]=ball
4,拆分以及合并图像通道
b,g,r=cv2.split(img)
img=cv2.merge(b,g,r)
或者
bgr
b=img[:,:,0] 蓝色通道
img[:,:,2]=0 红色通道置0
5,图像填充
BLUE=[255,0,0]
img1=cv2.imread('opencv_logo.png')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,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()
参数:img1输入图像 10,10,10,10是对应边界像素数目,边界类型(有颜色常数,镜像...)
二,图像上的算数运算
1,图像加法
x = np.uint8([250])
y = np.uint8([10])
print cv2.add(x,y) # 250+10 = 260 => 255
[[255]]
print x+y # 250+10 = 260 % 256 = 4
[4]
OpenCV 中的加法与 Numpy 的加法是有所不同的。OpenCV 的加法
是一种饱和操作,而 Numpy 的加法是一种模操作。
2.图像混合
import cv2
import numpy as np
img1=cv2.imread('ml.png')
img2=cv2.imread('opencv_logo.jpg')
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindow()
3,按位运算
AND,OR,NOT,XOR
三,程序优化
1,检测程序效率
import cv2
import numpy as np
e1 = cv2.getTickCount()
# your code execution
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()
2,优化
使用函数 cv2.useOptimized()
来查看优化是否被开启了,使用函数 cv2.setUseOptimized() 来开启优化