Java 彩色Canny边缘检测计算问题

Java 彩色Canny边缘检测计算问题,java,image-processing,graphics,edge-detection,sobel,Java,Image Processing,Graphics,Edge Detection,Sobel,我正在为图形课做一个学校项目。我的任务是检测彩色图像的边缘,我们收到了使用Canny边缘检测算法的建议 我决定自己用Java编写整个程序,因为使用给定的公式看起来很容易。我用JavaSwing创建了一个窗口,我将输入图像作为sRGB图像读取,并将其转换为CIELab*(因为这是任务的一部分)。我成功地应用了确定偏导数的Sobel核(Cx,Cy)。然而,我坚持方向公式,并对其进行编码 我的第一个问题是,我不知道是应该在每个单独的颜色通道中计算方向,还是一块一块地计算 以下是计算公式(首先是方向,我

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

我决定自己用Java编写整个程序,因为使用给定的公式看起来很容易。我用JavaSwing创建了一个窗口,我将输入图像作为sRGB图像读取,并将其转换为CIELab*(因为这是任务的一部分)。我成功地应用了确定偏导数的Sobel核(Cx,Cy)。然而,我坚持方向公式,并对其进行编码

我的第一个问题是,我不知道是应该在每个单独的颜色通道中计算方向,还是一块一块地计算

以下是计算公式(首先是方向,我一直坚持,在正确的大小上有需要方向θ的大小)

以下是计算方向的源代码:

//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;
}
//从Cx、Cy返回渐变方向
公共实验室方向(实验室Cx、实验室Cy){
LabImg结果=新的LabImg(Cx.getWidth(),Cx.getHeight());
对于(int x=0;x

LabImg
是一种数据类型,包含图像大小、2D像素值数组和缓冲图像。

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

其次,您可以计算震级和方向,如下所示:

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

索贝尔计算一阶导数。罗伯茨算子在噪声敏感性和旋转不变性方面比索贝尔算子差。但是你的大小和方向代码是正确的。对于数量级,我建议使用
Math.hypot
,它可以避免下溢和上溢。谢谢你的回答。如果我用sobel核表示Cx和Cy,我可以用这些方程吗?是的,你可以用这些方程。作为参考,我在哪里使用θ,对于震级,这些东西我不清楚,因为在链接的图片(震级)中,有一个输入θ。在计算震级时没有使用θ。我不知道从哪里得到这些方程,但它们是垃圾。你有两个偏导数。这些形成梯度向量。这个向量的大小和方向很容易用
hypot
atan2
来计算。我是从老师那里得到的。那是他唯一的帮助。这是来自ieee信号处理杂志(2005年1月)-第66页。他说我也需要用那些方程,但对我来说不行,。。。我现在就用建议的试一下。谢谢你的帮助!