首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >彩色Canny边缘检测计算问题

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

Stack Overflow用户
提问于 2018-04-24 10:48:08
回答 1查看 375关注 0票数 2

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

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

我的第一个问题是,我不知道是应该在每个单独的颜色通道上计算方向,还是用一个片段来计算。

这里是计算公式(首先是方向,我被困住了,在合适的大小上,有一个要求方向-theta的震级)

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

代码语言:javascript
复制
//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数组和缓冲图像。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-24 14:55:17

如果要进行颜色边缘检测,则需要分别处理每个颜色通道。因此,你必须为这三个颜色通道分别找到梯度方向。

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

代码语言:javascript
复制
magnitude = Math.sqrt(Xgrad*Xgrad + Ygrad*Ygrad)
theta = Math.atan2(Ygrad,Xgrad)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49999784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档