Проблемы расчета цветного обнаружения края Canny

Я работаю над школьным проектом для класса графики. Моя задача — выделение краев на цветном изображении, поступило предложение использовать алгоритм обнаружения краев Канни.

Я решил написать всю программу сам на Java, потому что с приведенными формулами это выглядит легко. Я создал окно с Java Swing, я читаю входное изображение как изображение sRGB, преобразовывая его в CIELab* (потому что это часть задачи). Мне удалось применить ядра Собеля (Cx, Cy), которые определяют частную производную. Однако я застрял с формулой направления и кодирую ее.

Моя первая проблема заключается в том, что я не знаю, должен ли я вычислять направления в каждом отдельном цветовом канале или делать это одним куском.

Вот формулы для расчетов (сначала это направление, с которым я застрял, а на правильном размере есть величина, которая требует направления -тета)

pic

Вот исходный код для расчета направления:

//Returns the gradients direction from Cx,Cy
public LabImg direction(LabImg Cx, LabImg Cy) {
    LabImg result = new LabImg(Cx.getWidth(),Cx.getHeight());
    for(int x = 0; x < result.getWidth(); x++) {
        for(int y = 0; y < result.getHeight(); y++) {
            float CxL = Cx.getPixel(x, y).getL();
            float Cxa = Cx.getPixel(x, y).getA();
            float Cxb = Cx.getPixel(x, y).getB();

            float CyL = Cy.getPixel(x, y).getL();
            float Cya = Cy.getPixel(x, y).getA();
            float Cyb = Cy.getPixel(x, y).getB();

            float dirL = (float) ((2*CxL*CyL)/((CxL*CxL)-(CyL*CyL)));
            float dira = (float) ((2*Cxa*Cya)/((Cxa*Cxa)-(Cya*Cya)));
            float dirb = (float) ((2*Cxb*Cyb)/((Cxb*Cxb)-(Cyb*Cyb)));

            //float dir = (2*CxL*CyL+Cxa*Cya+Cxb*Cyb)/((CxL*CxL+Cxa*Cxa+Cxb*Cxb)-(CyL*CyL+Cya*Cya+Cyb*Cyb));

            result.setLab(x, y, dirL, dira, dirb);
        }
    }
    return result;
}

LabImg — это тип данных, который содержит размер изображения, двумерный массив значений пикселей и буферизованное изображение.


person thepalacsinta007    schedule 24.04.2018    source источник
comment
Я не знаю, где вы взяли эти уравнения, но они ерунда. У вас есть две частные производные. Они формируют вектор градиента. Величину этого вектора и его ориентацию легко вычислить с помощью hypot и atan2.   -  person Cris Luengo    schedule 24.04.2018
comment
Я получил это от нашего учителя. Это была единственная помощь, которую он послал. это из журнала обработки сигналов IEEE (январь 2005 г.) - стр. 66. Он сказал, что мне нужно использовать и эти уравнения, но у меня это не сработало... Сейчас я попробую с предложенными. Спасибо за помощь!   -  person thepalacsinta007    schedule 24.04.2018


Ответы (1)


Если вы хотите выполнить обнаружение цветовых краев, вам нужно будет обрабатывать каждый цветовой канал отдельно. Таким образом, вам придется найти направления градиента для трех цветовых каналов отдельно.

Во-вторых, вы можете вычислить величину и направления как:

magnitude = Math.sqrt(Xgrad*Xgrad + Ygrad*Ygrad)
theta = Math.atan2(Ygrad,Xgrad)
person user8190410    schedule 24.04.2018
comment
Собель вычисляет первые производные. Оператор Робертса хуже, чем оператор Собеля, с точки зрения чувствительности к шуму и инвариантности к вращению. Но ваш код для величины и ориентации правильный. Для величины я бы рекомендовал использовать Math.hypot, что позволяет избежать недополнения и переполнения. - person Cris Luengo; 24.04.2018
comment
Спасибо за ответ. Итак, могу ли я использовать эти уравнения, если я использовал ядра Собеля для Cx и Cy? - person thepalacsinta007; 24.04.2018
comment
да, вы можете использовать это уравнение. Для справки: en.wikipedia.org/wiki/Sobel_operator - person user8190410; 24.04.2018
comment
И где мне использовать тета для величины, эти вещи для меня не ясны, потому что на связанной картинке (величина) есть ввод для теты. - person thepalacsinta007; 24.04.2018
comment
нет смысла использовать тета для вычисления величины - person user8190410; 24.04.2018
comment
Итак, все уравнения, которые у меня есть, были неправильными? Вау, спасибо за ответы! - person thepalacsinta007; 24.04.2018