import cv2 as cv
from numpy import shape
1.上下采样
up = cv.pyrUp(src)
down = cv.pyrDown(src)
"""
下采样:偶数行和列像素点去除pyrDown
上采样:每个像素点扩充,扩充点0填充pyrUp
"""
2.LP金字塔
down = cv.pyrDown(src)
down_up = cv.pyrUp(down)
LP = src - down_up # LP金字塔一层模型
"""
up-down 的效果明显比down-up更接近原图
拉普拉斯金字塔: img — down_up
"""
3.礼帽和黑帽
礼帽 : src - 开运算
黑帽 : src - 闭运算
4.轮廓检测
ret, thresh = cv.threshold(src, 127, 255, cv.THRESH_BINARY) # 二值化
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) # 轮廓提取
draw_image = src1.copy() # 复制图片从而不在原图上处理
res_draw = cv.drawContours(draw_image, contours, -1, (0, 0, 255), 1) # 绘制轮廓, 1位轮廓宽度, -1位需要绘制的轮廓
"""
findContours(src, mode, method)
mode:轮廓的检索
RETR_EXTERNAL:只检测最外面轮廓
LIST: 检测所有轮廓,并保留在一条链表中
CCOMP:检测所有轮廓,分为两层,顶层为外部边界,低层为空洞的边界
TREE:检测所有轮廓,并重构嵌套轮廓的整个层次
method: 轮廓的逼近
CHAIN_APPROX_NONE: 以Freeman链码方式输出,其他方法输出多边形(顶点的序列)
SIMPLE: 压缩水平、垂直和斜的部分,即只保留终点部分
对于长方形而言,NONE输出四条边, SIMPLE输出四个顶点
边缘检测流程: 灰度图--二值化--检测
contours, hierarchy = cv.findContours
contours: 轮廓信息
hierarchy:层级结构
"""
5.轮廓近似
src1 = cv.imread("D:/ALL_LEARN/picture/im1.png", cv.IMREAD_COLOR)
src = cv.cvtColor(src1, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(src, 127, 255, cv.THRESH_BINARY) # 二值化
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) # 轮廓提取
cnt = contours[0] # 取出第0个轮廓
draw_image = src1.copy()
epsilon = 0.1*cv.arcLength(cnt, True) # 绘制近似函数, 一般为周长
approx = cv.approxPolyDP(cnt, epsilon, True) # 轮廓近似
res_approx = cv.drawContours(draw_image, [approx], -1, (0, 0, 255), 2)
cv.imshow("thresh", res_approx)
cv.waitKey(0)
cv.destroyAllWindows()
"""
contourArea(cnt): 计算面积
arcLength(cnt, True) :计算周长,true 表示闭合
轮廓近似:将轮廓近似成一个较为规则的形状
:先取曲线的两端点AB,再找到曲线上一点到AB距离d最大的一点C,
:d<阈值,则AB作为近似
:d>阈值,计算AC、BC
"""
6.直方图
# 直方图
src = cv.imread("D:/ALL_LEARN/picture/cat.jpg", 0) # 0表示灰度图
src1 = cv.imread("D:/ALL_LEARN/picture/cat.jpg") # 0表示灰度图
hist = cv.calcHist([src], [0], None, [256], [0, 256])
print(hist.shape)
plt.hist(src.ravel(), 256)
plt.show()
mask = np.zeros(src.shape[:2], np.uint8) # 设置掩膜大小与图像大小一致
mask[100:300, 100:400] = 255 # 该区域为目标区域
masked_src = cv.bitwise_and(src, src, mask=mask) # 与操作
color = ('b', 'g', 'r') # 区分大小写
for i, col in enumerate(color):
histr = cv.calcHist([src1], [i], None, [256], [0, 256])
plt.plot(histr, color=col)
plt.xlim([0, 256])
plt.show()
# cv.waitKey(0)
# cv.destroyAllWindows()
"""
模板匹配不想看,暂时不写(匹配方法不是异源匹配)
直方图
calcHist(src,channels,mask,histSize,ranges)
src:uint8或float32格式,传入时应[src]
channels:[],灰度图[0],彩色图[0][1][2]
mask:掩膜,感兴趣区域,None
histSize:BIN数目,即读取的数值,一般为256
ranges:像素值范围[0,256]
"""
7.直方图均衡化
src = cv.imread("D:/ALL_LEARN/picture/cat.jpg", 0) # 0表示灰度图
src = src[300:700, 300:700]
src1 = cv.imread("D:/ALL_LEARN/picture/cat.jpg") # 0表示灰度图
src1 = src1[300:700, 300:700]
hist = cv.calcHist([src], [0], None, [256], [0, 256])
plt.hist(src.ravel(), 256)
plt.show()
equ = cv.equalizeHist(src) # 均衡化,只能均衡化灰度图
plt.hist(equ.ravel(), 256)
plt.show()
equ1 = cv.cvtColor(equ, cv.COLOR_GRAY2RGB) # 转出来并不是彩色图像,只是有三个通道罢了
# 自适应均衡化
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(16, 16))
res_clahe = clahe.apply(src)
res = np.hstack((src, equ, res_clahe))
cv.imshow("res", res)
cv.waitKey(0)
cv.destroyAllWindows()
"""
均衡化:细节信息减少
自适应均衡化:噪声影响大.(设置区域,每个区域单独均衡化)
"""
8.傅里叶变换
src = cv.imread("D:/ALL_LEARN/picture/cat.jpg", 0)
src = src[300:700, 300:700]
img_32 = np.float32(src) # 转为32格式
dft = cv.dft(img_32, flags=cv.DFT_COMPLEX_OUTPUT) # 1次傅里叶变换
dft_shift = np.fft.fftshift(dft) # 低频值转换到中间
# mag_spe = 20 * np.log(cv.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) # 映射回图像
rows, cols = src.shape
crow, c_col = int(rows / 2), int(cols / 2) # 中心位置
# 滤波
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow - 60:crow + 60, c_col - 60:c_col + 60] = 1 # 设置60*60掩码, 1为低通,0为高通, 1掩码部分为白
# I_DFT
f_shift = dft_shift * mask
fi_shift = np.fft.fftshift(f_shift)
src_back = cv.idft(fi_shift)
src_back = cv.magnitude(src_back[:, :, 0], src_back[:, :, 1])
plt.subplot(121), plt.imshow(src, cmap='gray')
plt.title("src"), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(src_back, cmap='gray')
plt.title("result"), plt.xticks([]), plt.yticks([])
plt.show()
cv.waitKey(0)
cv.destroyAllWindows()
"""
cv.dft():
cv.idft():逆变换
"""