如何解决如何在 opencv python
我试图从 TEM(显微镜)图像中获取该物体的边缘,但问题是接触率很低,尤其是在上边缘,我尝试了几种阈值、对比度均衡……但我没有无法获得上边缘。
注意:我正在尝试计算液滴和管子之间的角度,我不确定这是否是解决此问题的最佳方法。
原图:
我得到的 Canny Edge 检测:
我得到这个结果的步骤是:
- 对比度增强
- 阈值
- 高斯滤波器
- Canny 边缘检测
代码:
clahe = cv2.createCLAHE(clipLimit=clip_limit,tileGridSize=(grid_size,grid_size))
equ = clahe.apply(img)
val = filters.threshold_otsu(equ)
mask = img < val
# denoising part
mask = filters.gaussian(mask,sigma=sigmaG)
# edge detection
edge = feature.canny(mask,sigma=sigmaC)
edge = img_as_ubyte(edge)
解决方法
我们有这张图片,我们想检测麦克风的边缘:
基本上,我将图像转换为灰度,添加高斯模糊,并使用精明的边缘检测器检测边缘。一个更重要的部分是通过扩大边缘然后腐蚀它们来填充检测到的边缘中的间隙。
以上都是在process
函数中实现的; draw_contours
函数基本上利用了 process
函数,并检测最大轮廓:
import cv2
import numpy as np
def process(img):
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_blur = cv2.GaussianBlur(img_gray,(11,11),7)
img_canny = cv2.Canny(img_blur,42)
kernel = np.ones((19,19))
img_dilate = cv2.dilate(img_canny,kernel,iterations=4)
img_erode = cv2.erode(img_dilate,iterations=4)
return img_erode
def draw_contours(img):
contours,hierarchies = cv2.findContours(process(img),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
cnt = max(contours,key=cv2.contourArea)
peri = cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,0.004 * peri,True)
cv2.drawContours(img,[approx],-1,(255,255,0),2)
img = cv2.imread("image.jpg")
h,w,c = img.shape
img = cv2.resize(img,(w // 2,h // 2))
draw_contours(img)
cv2.imshow("Image",img)
cv2.waitKey(0)
输出:
您可以通过调整 process
函数中的一些值来省略删除。例如,值
def process(img):
img_gray = cv2.cvtColor(img,10)
img_canny = cv2.Canny(img_blur,38)
kernel = np.ones((13,13))
img_dilate = cv2.dilate(img_canny,iterations=3)
img_erode = cv2.erode(img_dilate,iterations=4)
return img_erode
输出:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。