在不同级别获取图像边缘

时间:2019-02-08 15:31:48

标签: opencv image-processing computer-vision edge-detection

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

org

一个人可以看到一些西红柿比另一个上的西红柿更亮,因此,Canny的结果如下:

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 );
}

1 个答案:

答案 0 :(得分:2)

我正在用python回答,它可以轻松转换为C ++。直方图均衡和伽马函数可用于增加灰度图像的对比度。

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()

Contrast enhanced 该图像显示了原始灰度图像和经过处理的图像之间的差异。

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()

Result