OpenCV学习笔记(Python)———— 画轮廓

画出轮廓:

1)运用cv2.findContours()函数

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('Wood chip 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('Wood chip contours', all_contours)

2)运用梯度

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()

3)Canny边缘检测

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()

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年3月28日
下一篇 2022年3月29日

相关推荐