我有一个幼苗托盘的下面的图像,我正在尝试检测托盘边缘。
当我尝试运行Canny边缘检测时-在应用高斯模糊之后-这是提供的结果:
运行概率Hough变换会导致混乱,如下图所示:
由于图像中对象的细节和层次,是否应该使用opencv函数?我应该使用完全不同的程序吗?下面是一个我希望输出能够实现的示例:
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)。较低=检测到更多行。我探索了一些基于卷积的方法,我建议你看看它们。从长远来看,如果你一直有模糊线条的图像,那么尝试匹配每个花盆的形状或角落可能会更好。
1条答案
按热度按时间wxclj1h51#
我更新了我的方法与一些预处理,以展平图像(“removebg”)以及形态学操作(打开和关闭)与结构元素分别匹配垂直条和水平条,以增强种植机边缘后阈值。大多数参数可以针对不同尺寸的物体和图像进行调整,这是从小分辨率照片到全分辨率的主要问题。HoughLines的主要参数是检测阈值,我根据图像的大小进行了粗略的计算,似乎工作得很好。这段代码似乎适用于示例图像的小版本和大版本。
为了得到这些缺失的水平线,我首先要处理的是hough_thresh上的乘法器(在这篇文章中设置为0.3)。较低=检测到更多行。
我探索了一些基于卷积的方法,我建议你看看它们。从长远来看,如果你一直有模糊线条的图像,那么尝试匹配每个花盆的形状或角落可能会更好。