利用opencv检测包含多个元素的细节图像中的边缘线

gdx19jrr  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一个幼苗托盘的下面的图像,我正在尝试检测托盘边缘。

当我尝试运行Canny边缘检测时-在应用高斯模糊之后-这是提供的结果:

运行概率Hough变换会导致混乱,如下图所示:

由于图像中对象的细节和层次,是否应该使用opencv函数?我应该使用完全不同的程序吗?下面是一个我希望输出能够实现的示例:

wxclj1h5

wxclj1h51#

import cv2 as cv
import numpy as np
import math

def removebg(x,s):
    # return x - cv.GaussianBlur(x,(s,s),0)
    bi = cv.medianBlur(x,s).astype(np.float32)
    return x - (bi.astype(np.float32) - np.mean(bi))

def threshold_and_hough_lines(x,thresh):
    # x = (x > 10) *255
    x = x.astype(np.uint8)
    return cv.HoughLines(x,1,np.pi/360,thresh)

def outliers(x,factor=1):
    l,median,u = np.quantile(x,[.25,.5,.75])
    iqd = u-l
    _,thresh  = cv.threshold(x,median+factor*iqd,np.max(x),cv.THRESH_BINARY)
    return thresh

img = cv.imread("/data/stuff/seeds.jpeg")

print(img.shape)

draw_len=max(img.shape)*2

img_rembg = removebg(img,201)

cv.imwrite('img_rembg.jpg',img_rembg)

gray = np.mean(img_rembg,axis=2)

cv.imwrite('gray.jpg',gray)

thresh = outliers(gray)

cv.imwrite('thresh.jpg',thresh)

structure_element = np.ones((35,1))
structure_element = structure_element.astype(np.uint8)

iters=1
vlines = cv.morphologyEx(thresh, cv.MORPH_OPEN, structure_element,iterations=iters)
hlines = cv.morphologyEx(thresh, cv.MORPH_OPEN, structure_element.T,iterations=iters)

cv.imwrite('vlines.jpg',vlines)
cv.imwrite('hlines.jpg',hlines)

hough_thresh=int(math.sqrt(img.shape[0]*img.shape[1])*.3)
print(hough_thresh)

linesh = threshold_and_hough_lines(hlines,hough_thresh)
linesv = threshold_and_hough_lines(vlines,hough_thresh)

for line in (*linesh,*linesv):
    rho,theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + draw_len*(-b))
    y1 = int(y0 + draw_len*(a))
    x2 = int(x0 - draw_len*(-b))
    y2 = int(y0 - draw_len*(a))
    cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv.imwrite('combined.jpg',img)

我更新了我的方法与一些预处理,以展平图像(“removebg”)以及形态学操作(打开和关闭)与结构元素分别匹配垂直条和水平条,以增强种植机边缘后阈值。大多数参数可以针对不同尺寸的物体和图像进行调整,这是从小分辨率照片到全分辨率的主要问题。HoughLines的主要参数是检测阈值,我根据图像的大小进行了粗略的计算,似乎工作得很好。这段代码似乎适用于示例图像的小版本和大版本。
为了得到这些缺失的水平线,我首先要处理的是hough_thresh上的乘法器(在这篇文章中设置为0.3)。较低=检测到更多行。
我探索了一些基于卷积的方法,我建议你看看它们。从长远来看,如果你一直有模糊线条的图像,那么尝试匹配每个花盆的形状或角落可能会更好。

相关问题