我想在箱子里画西红柿的边缘。为此,我正在使用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 );
}
答案 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()
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()