Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 不同层次图像边缘的提取_Opencv_Image Processing_Computer Vision_Edge Detection - Fatal编程技术网

Opencv 不同层次图像边缘的提取

Opencv 不同层次图像边缘的提取,opencv,image-processing,computer-vision,edge-detection,Opencv,Image Processing,Computer Vision,Edge Detection,我想画板条箱里西红柿的边缘。我用这个 边缘检测算法。问题在于板条箱中的一些西红柿位于另一个西红柿的顶部,如下图所示: 正如人们所看到的,一些西红柿比另一个西红柿有更多的光线,因此Canny得出的结果如下: 正如人们所看到的,Canny无法检测到原始图像中光线较低的板条箱末端西红柿的边缘 有人能解决这个问题吗?(不可能在所有西红柿上获得均匀的光线,但如果有某种算法可以做到这一点,那将非常有用。) 以下是我的OpenCV代码: #include <opencv2/opencv.hpp>

我想画板条箱里西红柿的边缘。我用这个 边缘检测算法。问题在于板条箱中的一些西红柿位于另一个西红柿的顶部,如下图所示:

正如人们所看到的,一些西红柿比另一个西红柿有更多的光线,因此Canny得出的结果如下:

正如人们所看到的,Canny无法检测到原始图像中光线较低的板条箱末端西红柿的边缘

有人能解决这个问题吗?(不可能在所有西红柿上获得均匀的光线,但如果有某种算法可以做到这一点,那将非常有用。)

以下是我的OpenCV代码:

#include <opencv2/opencv.hpp>

using namespace cv;

Mat img, img_gray, img_value, fz, fg, I, pre, cost, vis, G, img_draw, in_que, skip, img_canny;

int main(){
    std::string filepath = "/Users/vedanshu/Desktop/IMG_5207.JPG";
    img = imread(filepath);
    cvtColor(img, img_gray, cv::COLOR_BGRA2GRAY);
    img_gray.copyTo(img_value);
    GaussianBlur(img_value, img_value, Size(3, 3), 0, 0, BORDER_DEFAULT);
    Canny(img_gray, img_canny, 50, 50);
    imwrite( "/Users/vedanshu/Desktop/test_canny.png", img_canny );
}
#包括
使用名称空间cv;
Mat img、img_gray、img_value、fz、fg、I、pre、cost、vis、G、img_draw、in_que、skip、img_canny;
int main(){
std::string filepath=“/Users/vedanshu/Desktop/IMG_5207.JPG”;
img=imread(文件路径);
CVT颜色(img、img_灰色、cv::COLOR_BGRA2GRAY);
img_gray.copyTo(img_值);
高斯模糊(img_值,img_值,大小(3,3),0,0,边界_默认值);
坎尼(伊姆格·格雷,伊姆格·坎尼,50,50);
imwrite(“/Users/vedanshu/Desktop/test_canny.png”,img_canny);
}

>我在Python中回答,它可以很容易地转换成C++。直方图均衡化和gamma函数可以用来提高灰度图像的对比度

img = cv2.imread('edge_tomatoes.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('original', gray)
denoise = cv2.fastNlMeansDenoising(gray,None,10,7,21)
hist = cv2.equalizeHist(denoise)
gamma = 2
invGamma = 1/gamma
table = np.array([((i / 255.0) ** invGamma) * 255
                  for i in np.arange(0, 256)]).astype("uint8")
gamm = cv2.LUT(hist, table, hist)
blur = cv2.GaussianBlur(gamm,(3,3),0)
cv2.imshow('modified', hist)
cv2.waitKey(0)
cv2.destroyAllWindows()
此图像显示原始灰度图像和处理后图像之间的差异

mask = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
canny = cv2.Canny(mask, 40, 200)
cv2.imshow('result', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()

< P>我在Python中回答,可以很容易地转换成C++。直方图均衡化和gamma函数可以用来提高灰度图像的对比度

img = cv2.imread('edge_tomatoes.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('original', gray)
denoise = cv2.fastNlMeansDenoising(gray,None,10,7,21)
hist = cv2.equalizeHist(denoise)
gamma = 2
invGamma = 1/gamma
table = np.array([((i / 255.0) ** invGamma) * 255
                  for i in np.arange(0, 256)]).astype("uint8")
gamm = cv2.LUT(hist, table, hist)
blur = cv2.GaussianBlur(gamm,(3,3),0)
cv2.imshow('modified', hist)
cv2.waitKey(0)
cv2.destroyAllWindows()
此图像显示原始灰度图像和处理后图像之间的差异

mask = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
canny = cv2.Canny(mask, 40, 200)
cv2.imshow('result', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()

要获得更好的对比度,您可以尝试。此外,你可以尝试检测“部分”西红柿,而不是精明。然而,对于非圆形的西红柿来说,这可能会失败。在这样一个容器中围绕每个西红柿画边界是一项不可能的任务。但是,如果您陈述了您试图解决的总体问题,我们可以提出可行的解决方案。@A可能总体问题是检测正常西红柿的缺陷。正如你在图片中看到的,有些西红柿有一些缺陷,我必须找到这些缺陷。在这种情况下,边界的划分对于你决定是否有缺陷西红柿可能并不重要。我建议您使用滑动窗口和基于CNN的图像分类器来解决您的问题。我的一般建议是,如果知道对象边界在总体目标中不起重要作用,则避免使用边界框进行分割。为了获得更好的对比度,您可以尝试。此外,你可以尝试检测“部分”西红柿,而不是精明。然而,对于非圆形的西红柿来说,这可能会失败。在这样一个容器中围绕每个西红柿画边界是一项不可能的任务。但是,如果您陈述了您试图解决的总体问题,我们可以提出可行的解决方案。@A可能总体问题是检测正常西红柿的缺陷。正如你在图片中看到的,有些西红柿有一些缺陷,我必须找到这些缺陷。在这种情况下,边界的划分对于你决定是否有缺陷西红柿可能并不重要。我建议您使用滑动窗口和基于CNN的图像分类器来解决您的问题。我的一般建议是,如果知道对象边界在总体目标中不起重要作用,则避免使用边界框进行分割。