整体分为三大模块
一、图像的基本操作 1、访问和修改像素#加载彩色图像
import numpy as np
import cv2 as cv
img = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
#可以通过行列坐标来访问像素值,对于BGR图像,返回红蓝绿组成的数组,对于灰色图像,返回相应的回复
px = img[100,100]
print(px)
#仅访问蓝色像素
blue =img[100,100,0]
print(blue)
#使用相同的方法修改像素值
img[100,100]=[255,255,255]
print(img[100,100])
备注:numpy的是用于快速数组计算的优化库,因此,简单的访问每个像素值并对其进行修改是非常缓慢的,不建议使用。
#更好的访问像素和编辑方法 img.item(10,10,2) #修改RED值 img.itemset((10,10,2),100)2、访问图像属性
属性包括行数、列数和通道数,图像数据类型,像素数;
#图像的形状 print(img.shape) #像素总数 print(img.size) #图像的数据类型 print(img.dtype)3、图像感兴趣区域ROI
感兴趣区域即对数据进行切片处理
ball = img[280:340,330:390] img[280:340,330:390]=ball4、拆分和合并图像通道
#拆分图像通道 b,g,r = cv.split(img) #合并图像通道 img = cv.merge((b,g,r)) #将所有的红色像素数据设为0,则无需先拆分通道 b = img [:, :, 0] img [:, :, 2] = 05、为图像设置边框(填充)
使用cv.copyMakeBorder()在图像周围创建边框,他在卷积计算,零填充等方面更有用,函数参数:
1、src:输入图像
2、top、bottom、left、right边界宽度
3、borderType:定义添加边框的类型
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
BLUE =[255,0,0]
img1 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
replicate = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT_101)
wrap = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_WRAP)
constant = cv.copyMakeBorder(img1,10,10,10,10,cv.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('reflect101')
plt.subplot(235)
plt.imshow(wrap,'gray')
plt.title('wrap')
plt.subplot(236)
plt.imshow(constant,'gray')
plt.title('constant')
二、图像的算法运算
1、图像加法
可以通过opencv的cv.add()或者numpy操作res=img1+img2添加两个图像,两个图像有相同的深度和类型,或者第二个图像是一个标量.
x = np.uint8([250]) y = np.uint8([10]) print(x+y) #4 print(cv.add(x,y)) #2552、图像融合
img1 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
img2 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()
3、按位运算
包括按位 AND、 OR、NOT 和 XOR 操作,改变图像的特定区域
#加载两张图片
img1 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
img2 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
#我想把图像放在左上角,所以我创建了ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
#现在创建图像的掩码,并同时创建其相反掩码
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray,10,255,cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
#现在将ROI中的logo的区域涂黑
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 仅从logo图像中提取logo区域
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将logo放入ROI并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()
三、性能衡量和提升技术
opencv通过cv.getTickCount,在执行函数之前和执行函数之后调用,可以获取执行函数的时间,cv.getTickFrequency等函数来提升代码的性能,除opencv之外,python 的time模块可执行代码时间,另外一个profile模块获取代码的详细报告,比如每个函数花费了多少时间,调用函数的次数等;
#代码的运行时间
img1 = cv.imread('C:\Users\Administrator\Desktop\123.jpg')
e1 = cv.getTickCount()
for i in range(5,49,2):
img1 = cv.medianBlur(img1,i)
e2 = cv.getTickCount()
time = (e2-e1)/cv.getTickFrequency()
print(time)
#检测是否启动了优化
#检查是否使用了优化 cv.useOptimized() %timeit res = cv.medianBlur(img,49) #关掉优化器 cv.setUseOptimized(False) cv.useOptimized() %timeit res = cv.medianBlur(img,49)



