Получение края изображения на другом уровне - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу нарисовать края помидоров в ящике.Для этого я использую Canny алгоритм обнаружения ребер.Проблема с этим заключается в том, что в ящике некоторые помидоры располагаются поверх другого, как показано на рисунке ниже:

org

Как одинможно увидеть, что некоторые помидоры имеют над ними больше света, чем другие, поэтому Кэнни дает следующий результат:

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 голосов
/ 08 февраля 2019

Я отвечаю на 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

...