彩色Canny边缘检测计算问题

时间:2018-04-24 10:48:08

标签: java image-processing graphics edge-detection sobel

我正在为图形课程开展一个学校项目。我的任务是检测彩色图像上的边缘,我们收到了使用Canny边缘检测算法的建议。

我决定用Java自己编写整个程序,因为使用给定的公式看起来很简单。我用Java Swing创建了一个窗口,我在输入图像中读取sRGB图像,将其转换为CIEL a b *(因为那是任务的一部分)。我设法应用了Sobel内核(Cx,Cy)来确定偏导数。但是我坚持使用方向公式,然后编码。

我的第一个问题是,我不知道是否应该在每个单独的颜色通道中计算方向,或者将其作为一个整体来计算。

以下是计算的公式(首先是方向,我坚持使用,而正确的尺寸是需要方向-theta的大小)

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是一种数据类型,包含图像的大小,像素值的2D数组和缓冲图像。

1 个答案:

答案 0 :(得分:2)

如果要进行颜色边缘检测,则需要单独处理每个颜色通道。因此,您必须分别找到三个颜色通道的渐变方向。

其次,您可以计算幅度和方向:

magnitude = Math.sqrt(Xgrad*Xgrad + Ygrad*Ygrad)
theta = Math.atan2(Ygrad,Xgrad)