微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 opencv python

如何解决如何在 opencv python

我试图从 TEM(显微镜)图像中获取该物体的边缘,但问题是接触率很低,尤其是在上边缘,我尝试了几种阈值、对比度均衡……但我没有无法获得上边缘。

注意:我正在尝试计算液滴和管子之间的角度,我不确定这是否是解决此问题的最佳方法

原图:

enter image description here

我得到的 Canny Edge 检测:

enter image description here

我得到这个结果的步骤是:

  1. 对比度增强
  2. 阈值
  3. 高斯滤波器
  4. 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)

解决方法

我们有这张图片,我们想检测麦克风的边缘:

enter image description here

基本上,我将图像转换为灰度,添加高斯模糊,并使用精明的边缘检测器检测边缘。一个更重要的部分是通过扩大边缘然后腐蚀它们来填充检测到的边缘中的间隙。

以上都是在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)

输出:

enter image description here

您可以通过调整 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

输出:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。