风火编程--opencv使用记事
opencv使用
基本方法
kernel = np.ones((5,5), dtype=np.uint8)
-
腐蚀运算
erosion = cv2.erode(img,kernel,iterations=1) -
膨胀运算
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1) -
开运算
去除毛刺
ernel = np.ones((5,5), dtype = np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) -
闭运算
加强细节
kernel = np.ones((5,5), dtype = np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) -
梯度运算
获取边缘
kernel = np.ones((5,5), dtype = np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) -
礼帽运算
保留毛刺
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) -
黑帽运算
保留整体轮廓
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) -
边缘检测
img=cv2.imread(“lena.jpg”,cv2.IMREAD_GRAYSCALE)
res =cv2.Canny(img,80,150) -
高斯滤波
gaussian = cv2.GaussianBlur(img, (3,3), 1)
图像金字塔
-
上采样
up = cv2.pyrUp(img) -
下采样
down = cv2.pyrDown(img) -
拉普拉斯金字塔
res = img - cv2.pyrUp(cv2.pyrDown(img))
轮廓相关
-
轮廓
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 1) -
轮廓近似
epsilon = 0.05*cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
draw_img = img.copy()
res = cv2.drawContours(draw_img, [approx], -1, (0,0,255), 2) -
外接矩形
img = cv2.imread(‘pic/edgestar.png’)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) #转为二值图
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) # 找轮廓
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)
draw_img = img.copy()
res = cv2.rectangle(draw_img, (x,y), (x+w,y+h), (0,255,0), 2) -
外接圆
(x,y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y)) # 圆心
radius = int(radius) # 半径
draw_img = img.copy()
res = cv2.circle(draw_img, center, radius, (0,255,0), 2)
模板匹配
img = cv2.imread('img_all.jpg', 0)
img2 = img.copy()
template = cv2.imread('img_splice.png', 0)# cv2.imshow('messi', img)
# cv2.imshow('face', template)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
# methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
# 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']meth = 'cv2.TM_CCOEFF'
img = img2.copy()
'''
exec可以用来执行储存在字符串货文件中的python语句
例如可以在运行时生成一个包含python代码的字符串
然后使用exec语句执行这些语句
eval语句用来计算存储在字符串中的有效python表达式
'''
method = eval(meth)
# 匹配应用
res = cv2.matchTemplate(img, template, method)
mn_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# print('mn_val',mn_val)
# print('max_val',max_val)
# print('min_loc',min_loc)
# print('max_loc',max_loc)
# 使用不同的方法,对结果的解释不同# 方法判断
# if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
# top_left = min_loc
# else:
# top_left = max_loc
top_left = max_loc
print('偏移像素',top_left[0])bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, 255, 2)plt.subplot(121), plt.imshow(res, cmap='gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img, cmap='gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle('method: ' + meth)
plt.show()# 多个对象
thd = 0.8
loc = np.where(res>0.8)
for pt in loc:bottom_right = (pt[0] + w, pt[1] + h)cv2.rectangle(img, top_left, bottom_right, 255, 2)
傅里叶变换
img = cv.imread('C:/Users/27706/Desktop/1.jpg', cv.IMREAD_GRAYSCALE)
img = cv.resize(img, (512, 1024))
img_float32 = np.float32(img) # 输入图像需要先转换为np.float32格式
dft = cv.dft(img_float32, flags=cv.DFT_COMPLEX_OUTPUT) # 第一个通道是结果的实部,第二个通道是结果的虚部
dft_shift = np.fft.fftshift(dft) # 将零频点移到频谱的中间
# magnitude_spectrum = 20 * np.log(cv.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) # 将值变换值0-255,可打印成图像观察rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2) # 图像中心位置# 低通滤波
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-511:crow+511, ccol-255:ccol+255] = 1 # 中间部分为低频,置1保留,中间置1区域越大,越接近原图
# 高通滤波
# mask = np.ones((rows, cols, 2), np.uint8)
# mask[crow-200:crow+200, ccol-200:ccol+200] = 0 # 中间部分为低频,置0舍去,中间置0区域越大,留下的信息越少# IDFT
fshift = dft_shift * mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv.idft(f_ishift)
img_back = cv.magnitude(img_back[:, :, 0], img_back[:, :, 1]) - 255plt.imshow(img_back, cmap='gray')
plt.show()
直方图均衡化
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np# mask = np.zeros(img.shape[:2], np.unit8)
# mask[100:300, 100:400] = 255
hist = cv.calcHist([img], [0], None, [256], [0, 256]) # None为掩码参数,也可用创建的mask
plt.hist(img.ravel(), 256) # 直方图绘制函数
plt.plot(hist, color = cool) # 也可利用hist绘制
plt.show()# 均衡化
equ = cv.equalizeHist(img)
plt.hist(equ.ravel(), 256)
plt.show()# 自适应直方图均衡化
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
res_clahe = clahe.apply(img)
角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04) #block:2,ksize:3,k:0.04
print('dst.shape:', dst.shape)img[dst>0.01*dst.max()] = [0,0,255] #把检测到的角点处用红色标记
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()