彩色Canny边缘检测计算问题
Colored Canny edge detection calculation problems
我正在做一个学校的图形项目 class。我的任务是检测彩色图像的边缘,我们收到了使用 Canny 边缘检测算法的建议。
我决定在 Java 中自己编写整个程序,因为使用给定的公式看起来很容易。我用 Java Swing 创建了一个 window,我将输入图像作为 sRGB 图像读取,将其转换为 CIELab*(因为那是任务的一部分)。我设法应用了确定偏导数的 Sobel 内核 (Cx,Cy)。但是我坚持使用方向公式并对其进行编码。
我的第一个问题是,我不知道我是应该在每个单独的颜色通道中计算方向,还是一次计算。
这里是计算公式(首先是方向,我一直坚持,在正确的尺寸上有需要方向-theta的大小)
这里是计算方向的源代码:
//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
是一种数据类型,其中包含图像的大小、像素值的二维数组和缓冲图像。
如果要进行颜色边缘检测,则需要对每个颜色通道分别进行处理。因此,您必须分别为三个颜色通道找到渐变方向。
其次,您可以计算大小和方向:
magnitude = Math.sqrt(Xgrad*Xgrad + Ygrad*Ygrad)
theta = Math.atan2(Ygrad,Xgrad)
我正在做一个学校的图形项目 class。我的任务是检测彩色图像的边缘,我们收到了使用 Canny 边缘检测算法的建议。
我决定在 Java 中自己编写整个程序,因为使用给定的公式看起来很容易。我用 Java Swing 创建了一个 window,我将输入图像作为 sRGB 图像读取,将其转换为 CIELab*(因为那是任务的一部分)。我设法应用了确定偏导数的 Sobel 内核 (Cx,Cy)。但是我坚持使用方向公式并对其进行编码。
我的第一个问题是,我不知道我是应该在每个单独的颜色通道中计算方向,还是一次计算。
这里是计算公式(首先是方向,我一直坚持,在正确的尺寸上有需要方向-theta的大小)
这里是计算方向的源代码:
//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
是一种数据类型,其中包含图像的大小、像素值的二维数组和缓冲图像。
如果要进行颜色边缘检测,则需要对每个颜色通道分别进行处理。因此,您必须分别为三个颜色通道找到渐变方向。
其次,您可以计算大小和方向:
magnitude = Math.sqrt(Xgrad*Xgrad + Ygrad*Ygrad)
theta = Math.atan2(Ygrad,Xgrad)