> 文章列表 > 风火编程--opencv使用记事

风火编程--opencv使用记事

风火编程--opencv使用记事

opencv使用

基本方法

kernel = np.ones((5,5), dtype=np.uint8)

  1. 腐蚀运算
    erosion = cv2.erode(img,kernel,iterations=1)

  2. 膨胀运算
    kernel = np.ones((5, 5), np.uint8)
    erosion = cv2.erode(img, kernel, iterations=1)

  3. 开运算
    去除毛刺
    ernel = np.ones((5,5), dtype = np.uint8)
    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

  4. 闭运算
    加强细节
    kernel = np.ones((5,5), dtype = np.uint8)
    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

  5. 梯度运算
    获取边缘
    kernel = np.ones((5,5), dtype = np.uint8)
    gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

  6. 礼帽运算
    保留毛刺
    tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

  7. 黑帽运算
    保留整体轮廓
    blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

  8. 边缘检测
    img=cv2.imread(“lena.jpg”,cv2.IMREAD_GRAYSCALE)
    res =cv2.Canny(img,80,150)

  9. 高斯滤波
    gaussian = cv2.GaussianBlur(img, (3,3), 1)

图像金字塔

  1. 上采样
    up = cv2.pyrUp(img)

  2. 下采样
    down = cv2.pyrDown(img)

  3. 拉普拉斯金字塔
    res = img - cv2.pyrUp(cv2.pyrDown(img))

轮廓相关

  1. 轮廓
    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)

  2. 轮廓近似
    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)

  3. 外接矩形
    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)

  4. 外接圆
    (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()