python_opencv 所有知识点汇总 附带opencv库的函数库

opencv+python

函数库下载地址:
https://download.csdn.net/download/Sun_Raiser/12606889

chapter 2

1.图像的读取,imread函数
i = cv2.imread("E:\\lesson\\image\\test.png")
2.图像的写入,imwrite函数
cv2.imwrite("E:\\lesson\\image\\lesson1.png", i)

chapter 3

1.像素处理,先调用numpy的包
i = cv2.imread("image\\lena256.bmp", cv2.IMREAD_UNCHANGED)
灰度图像
i[100, 100] = 255

numpy :

i.itemset((100, 100), 255)
彩色图像
i[100,100]=[255,255,255]

numpy:

i.itemset((100, 100, 2), 255)

元组内第三个参数可以是0,1,2,分别对应b,g,r

2.获取图像属性(三个)
a = cv2.imread("image\lena256.bmp", cv2.IMREAD_UNCHANGED)
print(a.shape)
print(a.size)
print(a.dtype)
3.感兴趣区域,切片
a = cv2.imread("image\lenacolor.png", cv2.IMREAD_UNCHANGED)
#face = np.ones((101, 101, 3)) 可写可不写
face = a[220:400, 250:350]
4.通道合并,merge函数
a = cv2.imread("image\lenacolor.png")
b, g, r = cv2.split(a)
bgr = cv2.merge([b, g, r])

g、b、r顺序的调换会影响到图片的效果

chapter 4

1.加法运算,‘+’
a = cv2.imread("image\lena512.bmp")
b = a
result1 = a + b
result2 = cv2.add(a, b)

一种是opencv的加法,另一种是重载运算符的加法

重载运算符的加法,当两数之和大于256时,进行求模运算

opencv的add函数,当两数之和大于256时,取256为最大值

2.加权平均数,addWeighted函数
result = cv2.addWeighted(a, 1, b, 1, 0)

第二,第四个参数为权重,第五个参数调节亮度

chapter 5

类型转换
a = cv2.imread("image\\lenacolor.png")
b = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)

参数可以是(包括但不限于):

cv2.COLOR_BGR2RGB
cv2.COLOR_GRAY2BGR

chapter 6

1.改大小,resize函数

指定大小:

b = cv2.resize(a, (200, 100))
# 注意:第2个参数控制的是“列长度、行长度”,注意顺序。

或者

size = (200, 100)
b = cv2.resize(a, size)
# 注意:第2个参数控制的是“列长度、行长度”,注意顺序。

按比例缩放:

b = cv2.resize(a, (round(cols * 0.5), round(rows * 1.2)))

resize函数的参数必须是整数,所以要使用round函数取整

或者

rows, cols = a.shape[:2]
size = (round(cols * 0.5), round(rows * 1.2))
b = cv2.resize(a, size)

或者

b = cv2.resize(a, None, fx=1.2, fy=0.5)
2.图像翻转,flip函数
b = cv2.flip(a, -1)

参数小于0,关于xy旋转;参数大于0,关于左右;0时,上下翻转

3.仿射变换,warpAfine函数

平移:

height, width = a.shape[:2]
x = 100
y = 200
M = np.float32([[1, 0, x], [0, 1, y]])
b = cv2.warpAffine(a, M, (height, width))

旋转:

height, width = a.shape[:2]
M = cv2.getRotationMatrix2D((height/2, width/2), 45, 0.6)
b = cv2.warpAffine(a, M, (height, width))

仿射变换:

rows, cols, ch = img.shape
p1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])
p2 = np.float32([[0, rows * 0.33], [cols * 0.85, rows * 0.25], [cols * 0.15, rows * 0.7]])
M = cv2.getAffineTransform(p1, p2)
dst = cv2.warpAffine(img, M, (cols, rows))

chapter 7

阈值化,threshold函数
a = cv2.imread("image\\lena512.bmp", cv2.IMREAD_UNCHANGED)
# 注意原始图像的类型,必须是8位单通道图像,彩色图像无意义
r, b = cv2.threshold(a, 127, 255, cv2.THRESH_BINARY_INV)

阈值函数返回两个参数,前一个是阈值,后一个是处理后的图像

chapter 8

1.滤波,blur函数
o = cv2.imread("image\\lenaNoise.png")
r = cv2.blur(o, (5, 5))
2.方框滤波,boxFilter函数
o = cv2.imread("image\\lenaNoise.png")
r = cv2.boxFilter(o, -1, (4, 4), normalize=1)

normalize = False or True,False 求和, True 求均值

归一化:均值

3.高斯滤波
r = cv2.GaussianBlur(o, (3, 3), 0)

核大小为奇数,第三个参数控制x方向权重,参数为0时自动计算

4.中值滤波
o = cv2.imread("image\\lenaNoise.png")
r = cv2.medianBlur(o, 3)

chapter 9

1.腐蚀,erode函数
k = np.ones((5, 5), np.uint8)
r = cv2.erode(o, k, iterations=10)

iteration:迭代次数

2.膨胀,dilate函数
k = np.ones((5, 5), np.uint8)
r = cv2.dilate(o, k, iterations=1)
3.开运算,函数cv2.morphologyEx,参数cv2.MORPH_OPEN
k = np.ones((5, 5), np.uint8)
r = cv2.morphologyEx(o, cv2.MORPH_OPEN, k)

先腐蚀,后膨胀

4.闭运算,函数cv2.morphologyEx,参数cv2.MORPH_CLOSE
k = np.ones((5, 5), np.uint8)
r = cv2.morphologyEx(o, cv2.MORPH_CLOSE, k)

先膨胀,后腐蚀

5.梯度运算,函数cv2.morphologyEx,参数cv2.MORPH_GRADIENT
k = np.ones((5, 5), np.uint8)
r = cv2.morphologyEx(o, cv2.MORPH_GRADIENT, k)

膨胀 - 腐蚀

6.顶(礼)帽操作,函数cv2.morphologyEx,参数cv2.MORPH_TOPHAT
k = np.ones((5, 5), np.uint8)
r = cv2.morphologyEx(o, cv2.MORPH_TOPHAT, k)

原图 - 开运算

7.黑帽操作,函数cv2.morphologyEx,参数cv2.MORPH_BLACKHAT
k = np.ones((10, 10), np.uint8)
r = cv2.morphologyEx(o, cv2.MORPH_BLACKHAT, k)

闭运算 - 原图

chapter 10

1.sobel算子

x方向:

scharrx = cv2.Scharr(o, cv2.CV_64F, 1, 0)
scharrx = cv2.convertScaleAbs(scharrx)  # 转回uint8

y方向:

scharry = cv2.Scharr(o, cv2.CV_64F, 0, 1)
scharry = cv2.convertScaleAbs(scharry)  # 转回uint8

xy方向:

scharrx = cv2.Scharr(o, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(o, cv2.CV_64F, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)  # 转回uint8
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
2.scharr算子:

x方向:

scharrx = cv2.Scharr(o, cv2.CV_64F, 1, 0, -1)
scharrx = cv2.convertScaleAbs(scharrx)  # 转回uint8

y方向:

scharry = cv2.Scharr(o, cv2.CV_64F, 0, 1, -1)
scharry = cv2.convertScaleAbs(scharry)  # 转回uint8

xy方向:

scharrx = cv2.Scharr(o, cv2.CV_64F, 1, 0, -1)
scharry = cv2.Scharr(o, cv2.CV_64F, 0, 1, -1)
scharrx = cv2.convertScaleAbs(scharrx)  # 转回uint8
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

scharr算子只要在sobel函数的末尾加上-1为参数即可转换,scharr算子是sobel算子的改进版

chapter 11

canny算子边缘检测
r = cv2.Canny(o, 150, 200)

两个参数为阈值,阈值越小,边界信息越丰富。

chapter 12

1.图像金字塔向下取样,pyrDown函数
r = cv2.pyrDown(o)

图像减小为原图像的四分之一。

2.图像金字塔向上取样,pyrUp函数
r = cv2.pyrUp(o)

图像增大四倍。

3.拉普拉斯金字塔
od = cv2.pyrDown(o)
odu = cv2.pyrUp(od)
lapPyr = o - odu

chapter 13

图像轮廓,findContours和drawContours函数
1.findContours函数
contours, hierarchy = cv2.findContours(image, mode, method)

​ image 原始图像

contours 轮廓 mode 轮廓检索模式

hierarchy 图像的拓扑信息 method 轮廓的近似方法

contours, hierarchy = cv2.findContours(image, mode, method)

mode:

cv2.RETR_EXTERNAL :表示只检测外轮廓

cv2.RETR_LIST :检测的轮廓不建立等级关系

cv2.RETR_CCOMP :建立两个等级的轮廓,上面的一层为外边界,里 面的一层为内孔的边界信息。如果内孔内还有 一个连通物体,这个物体的边界也在顶层。

cv2.RETR_TREE :建立一个等级树结构的轮廓。

contours, hierarchy = cv2.findContours(image, mode, method)

method:

cv2.CHAIN_APPROX_NONE :存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y1-y2))==1

cv2.CHAIN_APPROX_SIMPLE :压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

cv2.CHAIN_APPROX_TC89_L1 :使用teh-Chinnl chain近似算法

cv2.CHAIN_APPROX_TC89_KCOS :使用teh-Chinl chain近似算法

2.drawContours函数
r=cv2.drawContours(o,contours,contourldx,color[,thickness])

r :目标图像,直接修改目标的像素点,实现绘制

o :原始图像

contours :需要绘制的边缘数组。

contourldx:需要绘制的边缘索引,如果全部绘制则为-1

color :绘制的颜色,为BGR格式的Scalar。

thickness :可选,绘制的密度,即描绘轮廓时所用的画笔粗细。

附:

新版本opencv,findContours返回两个参数,旧版本返回三个参数,分别是image, contours, hierarchy

chapter 14

1.直方图绘制

需引入matplot.pyplot包:

m = plt.hist(o.ravel(), 256)
plt.show()

两个参数: 展开成一维数组,数字范围。

opencv:

hist = cv2.calcHist([img], [0], None, [256], [0, 255])

返回列表,256 * 1

2.plot的使用

y = sin(x)函数:

x = np.arange(0, 5, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()

色彩曲线:

a = [1, 2, 1, 2]  # 仅有4个元素的列表
# 以红色曲线,显示列表的值
plt.plot(a, color='r')
plt.show()

y = f(x)集合对应:

x = [0, 0.5, 2, 3.5, 4, 4.3, 6]
y = [0.3, 0.4, 2, 5, 3, 4.5, 4]
plt.plot(x, y)
plt.show()

以整数为自变量:

y = [0.3, 0.4, 2, 5, 3, 4.5, 4]
plt.plot(y)
plt.show()
3.绘制图像直方图

单色:

o = cv2.imread("image\\boatGray.bmp")
histb = cv2.calcHist([o], [0], None, [256], [0, 255])
plt.plot(histb, color='r')
plt.show()

彩色:

o = cv2.imread("image\\girl.bmp")
histb = cv2.calcHist([o], [0], None, [256], [0, 255])
histg = cv2.calcHist([o], [1], None, [256], [0, 255])
histr = cv2.calcHist([o], [2], None, [256], [0, 255])
plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
plt.show()
4.掩膜直方图
image = cv2.imread("image\\girl.bmp", cv2.IMREAD_GRAYSCALE)
mask = np.zeros(image.shape, np.uint8)
mask[200:400, 200:400] = 255
histMI = cv2.calcHist([image], [0], mask, [256], [0, 255])
histImage = cv2.calcHist([image], [0], None, [256], [0, 255])
# hist直方图函数参数加[]
plt.plot(histImage)
plt.plot(histMI)
plt.show()

一个未mask,一个mask处理,两图的比较

5.掩膜演示
mask = np.zeros(image.shape, np.uint8)
mask[200:400, 200:400] = 255
mi = cv2.bitwise_and(image, mask)
cv2.imshow('original', image)
cv2.imshow('mask', mask)
cv2.imshow('mi', mi)
6.直方图均衡化

figure函数使图像分开

函数:equalizeHist函数

plt.hist须将二维图像转化为一维数组,以下

img = cv2.imread('image\\equ.bmp', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
plt.hist(img.ravel(), 256)
plt.figure()
plt.hist(equ.ravel(), 256)
plt.show()

绘制两张直方图,分别表示均衡前后像素情况的对比,以下

o = cv2.imread("image\\equ.bmp", cv2.IMREAD_GRAYSCALE)
r = cv2.equalizeHist(o)
cv2.imshow("original", o)
cv2.imshow("result", r)

显示均衡化前后的两张图,以下

o = cv2.imread("image\\equ.bmp", cv2.IMREAD_GRAYSCALE)
r = cv2.equalizeHist(o)
cv2.imshow("original", o)
cv2.imshow("result", r)
cv2.waitKey()
cv2.destroyAllWindows()
7.分图表示,subplot函数
img = cv2.imread('image\\equ.bmp', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
#
plt.subplot(121), plt.hist(img.ravel(), 256)
plt.subplot(122), plt.hist(equ.ravel(), 256)
# subplot,当函数参数小于10的时候可以直接省去“,”
plt.show()
8.imshow函数显示图像

灰度图像:

o = cv2.imread('image\\girl.bmp')
g = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
#1
plt.subplot(221), plt.imshow(o),                   plt.axis('off')
#2
plt.subplot(222), plt.imshow(o, cmap=plt.cm.gray), plt.axis('off')
#3
plt.subplot(223), plt.imshow(g),                   plt.axis('off')
#4
plt.subplot(224), plt.imshow(g, cmap=plt.cm.gray), plt.axis('off')
#
plt.show()

彩色图像:

img = cv2.imread('image\\girl.bmp')
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])
#
plt.subplot(121), plt.imshow(img), plt.axis('off')
plt.subplot(122), plt.imshow(img2), plt.axis('off')
#
plt.show()

chapter 15

1.numpy傅里叶(顺+逆)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
2.opencv傅里叶(顺+逆)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
ishift = np.fft.ifftshift(dftShift)
iImg = cv2.idft(ishift)
iImg = cv2.magnitude(iImg[:, :, 0], iImg[:, :, 1])

两个通道分别转换

3.高通滤波
#
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)
fshift[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0
#
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
#
4.低通滤波
img = cv2.imread('image\\lena.bmp', 0)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)
mask = np.zeros((rows, cols, 2), np.uint8)
# 两个通道,与频谱图像匹配
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1
fShift = dftShift * mask
ishift = np.fft.ifftshift(fShift)
iImg = cv2.idft(ishift)
iImg = cv2.magnitude(iImg[:, :, 0], iImg[:, :, 1])

猜你喜欢

转载自blog.csdn.net/Sun_Raiser/article/details/107303668