2

グラフィッククラスの学校プロジェクトに取り組んでいます。私の仕事は、色付きの画像のエッジを検出することです。Canny エッジ検出アルゴリズムを使用するよう提案を受けました。

プログラム全体を Java で自分で書くことにしました。Java Swing でウィンドウを作成しました。入力画像を sRGB 画像として読み込み、CIEL a b* に変換しています (これはタスクの一部であるため)。偏導関数を決定するソーベル カーネル (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;
}

LabImgイメージのサイズ、ピクセル値の 2D 配列、およびバッファリングされたイメージを含むデータ型です。

4

1 に答える 1