import cv2
# 读取数据
mupian = cv2.imread(r"图片地址,例:E:\dataset\train\image.jpg")
# 转化为灰度图像
gray_mupian = cv2.cvtColor(mupian, cv2.COLOR_RGB2GRAY)
# 二化值
ret, thresh = cv2.threshold(gray_mupian, 127, 255, cv2.THRESH_BINARY)
# 显示原图的二值化灰度图
cv2.imshow('gray picture', thresh)
# 计算轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# cv2.RETR_TREE 检索所有的轮廓,并重构嵌套轮廓的整个层次
# cv2.CHAIN_APPROX_NONE 存储所有的轮廓点
# 复制图片
draw_img1 = mupian.copy()
# 画轮廓 -1是指所有的轮廓
all_contours = cv2.drawContours(draw_img1, contours, -1, (0, 255, 0), 2)
cv2.imshow('contours', all_contours)
1. 梯度 = 膨胀 - 腐蚀
import cv2
import numpy as np
# 梯度 = 膨胀-腐蚀 (多出来的白边 减去 减少的白边,即计算一个轮廓出来)
pie = cv2.imread(r"图片地址")
kernel = np.ones((7, 7), np.uint8)
dilate = cv2.dilate(pie, kernel, iterations = 5) # 膨胀
cv2.imshow('dilate', dilate)
erosion = cv2.erode(pie, kernel, iterations = 5) # 腐蚀
cv2.imshow('erosion', erosion)
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.Sobel算子
cv2.Sobel(src, ddepth, dx, dy, ksize) 函数进行sobel算子计算
参数说明: src表示当前图片,ddepth表示图片深度,这里使用cv2.CV_64F使得结果可以是负值,
dx表示x轴方向,
dy表示y轴方向,
ksize表示移动方框的大小
cv2.convertScalerAbs(src) 将像素点进行绝对值计算
import cv2
img = cv2.imread(r"图片地址", cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1,0, ksize=3) # 1,0: 表示只算水平的,不算竖直的
sobelxx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F, 0,1, ksize=3) # 0,1: 表示只不算水平的,算竖直的
sobelyy = cv2.convertScaleAbs(sobely)
# 分别计算x和y,再求和,融合的较好
sobelxy_1 = cv2.addWeighted(sobelxx, 0.5, sobelyy, 0.5, 0)
# 不建议直接计算,融合的不好
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1,1, ksize=3)
sobelxy_2 = cv2.convertScaleAbs(sobelxy)
cv2.imshow('sobelxx',sobelxx)
cv2.imshow('sobelyy',sobelyy)
cv2.imshow('sobelxy_1',sobelxy_1)
cv2.imshow('sobelxy_2',sobelxy_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.Scharr算子
import cv2
# Scharr算子比Sobel算子更敏感,捕获更多细节,更丰富
img = cv2.imread(r"图片地址", cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(img, cv2.CV_64F, 1,0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
cv2.imshow('scharrxy',scharrxy)
cv2.waitKey(0)
cv2.destroyAllWindows()
1. 使用高斯滤波器,以平滑图像,滤除噪声。
2. 计算图像中每个像素点的梯度强度和方向。
3. 应用非极大值(Non-Maximum Suppression, NMS)抑制,以消除边缘检测带来的杂散响应。
4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5. 通过抑制孤立的弱边缘最终完成边缘检测。
参考视频:图像处理中最经典的边沿检测算法: Canny边缘检测_哔哩哔哩_bilibili
import cv2
import numpy as np
img = cv2.imread(r"图片地址", cv2.IMREAD_GRAYSCALE)
v1 = cv2.Canny(img, 80, 150)
v2 = cv2.Canny(img, 50, 100) # 阈值设置的合适,就可以把细节信息展示更多,细纹理都显现出来了
res = np.hstack((img, v1, v2))
cv2.imshow('Canny_res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()