C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ラプラシアンフィルタを用いたエッジ検出プログラム


(過去ログ 115 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■67620 / inTopicNo.1)  ラプラシアンフィルタを用いたエッジ検出プログラム
  
□投稿者/ 774 (1回)-(2013/08/17(Sat) 10:33:06)

分類:[VB.NET/VB2005 以降] 

開発環境:Visual Studio 2012 Express for windows desktop
使用言語:Visual basic 2012

こんにちは。774と申します。現在VBを使用した画像処理について学習中です。

今回質問させて頂くのはラプラシアンフィルタを用いたエッジ検出プログラムについてです。
msdnのアルゴリズム画像処理入門第3章(http://msdn.microsoft.com/ja-jp/cc998604)のC#での上記の方法でのエッジ検出プログラムを参考にして取り組んでいるのですが、
一応完成したソースコードでエラーもなく実行してみたところ、期待する結果が得られず、一面黒一色になってしまいます。

何度かソースコードを見返してみたのですがなにが間違っているのかわかりません。お力添え頂けると幸いです。

上記の参考ページのソースコードの、画像に対するフィルタの直後の(中略)の部分が何を略したのかがわからなかったことが問題の一つだと思います。

初歩的な質問になるかもしれませんが何卒よろしくお願い致します。

[以下ソースコード]

    Public Sub Lapacian(iAmp As Integer)
        Dim i As Integer, j As Integer, iColorValue As Integer
        Dim iFilter As Integer() = New Integer() {-1, -1, -1, -1, 8, -1, _
                                                  -1, -1, -1}
        '変数の宣言 iArrayValue : ピクセル色情報の配列

        Dim iArrayValue As Integer(,) = New Integer(PictureBox1.Image.Width - 1, PictureBox1.Image.Height - 1) {}
        Dim cArrayColor As Color() = New Color(8) {} '変数の宣言 cArrayColor : 色情報の配列
        Dim cSetColor As Color '変数の宣言 cSetColor : 設定する色
        Dim bBitmap As Bitmap = New Bitmap(PictureBox1.Image)

        '画像に対するフィルタ処理

        For i = 1 To PictureBox1.Image.Width - 2

            For j = 1 To PictureBox1.Image.Height - 2

                iColorValue =
                    iFilter(0) * cArrayColor(0).R + iFilter(1) * cArrayColor(1).R +
                    iFilter(2) * cArrayColor(2).R + iFilter(3) * cArrayColor(3).R +
                    iFilter(4) * cArrayColor(4).R + iFilter(5) * cArrayColor(5).R +
                    iFilter(6) * cArrayColor(6).R + iFilter(7) * cArrayColor(7).R +
                    iFilter(8) * cArrayColor(8).R

                iColorValue = iAmp * iColorValue '出力レベルの設定

                ' icolorValue が負の場合

                If iColorValue < 0 Then

                    iColorValue = -iColorValue                '正の値に変換

                End If


                'iColorValueが255より大きい場合

                If iColorValue > 255 Then
                    iColorValue = 255   'icolorValue を255に設定
                End If

                iArrayValue(i, j) = iColorValue 'icolorValueの設定

            Next
        Next

        ' フィルタ処理の結果の出力

        For i = 1 To PictureBox1.Image.Width - 2

            For j = 1 To PictureBox1.Image.Height - 2
                'iArrayValue値による色の設定
                cSetColor = Color.FromArgb(iArrayValue(i, j),
                                           iArrayValue(i, j), iArrayValue(i, j))
                'ピクセルの色の設定

                bBitmap.SetPixel(i, j, cSetColor)
            Next
        Next

        PictureBox2.Image = bBitmap
    End Sub

引用返信 編集キー/
■67621 / inTopicNo.2)  Re[1]: ラプラシアンフィルタを用いたエッジ検出プログラム
□投稿者/ shu (367回)-(2013/08/17(Sat) 10:50:12)
No67620 (774 さん) に返信

> Dim cArrayColor As Color() = New Color(8) {} '変数の宣言 cArrayColor : 色情報の配列
の宣言から

> ColorValue = ・・・ cArrayColor ・・・
で使用するまで配列に値が設定されていません。

□□□
□■□
□□□

■が(i,j)に相当するピクセルとして
(i-1,j-1) => cArrayColor(0)
(i ,j-1) => cArrayColor(1)
(i+1,j-1) => cArrayColor(2)
(i-1,j ) => cArrayColor(3)
(i ,j ) => cArrayColor(4)
(i+1,j ) => cArrayColor(5)
(i-1,j+1) => cArrayColor(6)
(i ,j+1) => cArrayColor(7)
(i+1,j+1) => cArrayColor(8)
となるように色情報を設定するのではないでしょうか。
引用返信 編集キー/
■67622 / inTopicNo.3)  Re[2]: ラプラシアンフィルタを用いたエッジ検出プログラム
□投稿者/ 774 (2回)-(2013/08/17(Sat) 11:14:33)
No67621 (shu さん) に返信
>>Dim cArrayColor As Color() = New Color(8) {} '変数の宣言 cArrayColor : 色情報の配列
> の宣言から
>
>>ColorValue = ・・・ cArrayColor ・・・
> で使用するまで配列に値が設定されていません。
>
> □□□
> □■□
> □□□
>
> ■が(i,j)に相当するピクセルとして
> (i-1,j-1) => cArrayColor(0)
> (i ,j-1) => cArrayColor(1)
> (i+1,j-1) => cArrayColor(2)
> (i-1,j ) => cArrayColor(3)
> (i ,j ) => cArrayColor(4)
> (i+1,j ) => cArrayColor(5)
> (i-1,j+1) => cArrayColor(6)
> (i ,j+1) => cArrayColor(7)
> (i+1,j+1) => cArrayColor(8)
> となるように色情報を設定するのではないでしょうか。

返答ありがとうございます!ご指摘通り確かにcArrayColorを空のままで使用していました…。

アドバイスを頂いた箇所を次のように修正したところ期待していたものに近い結果が得られました!

[修正箇所]
cArrayColor(0) = bBitmap.GetPixel(i - 1, j - 1)
cArrayColor(1) = bBitmap.GetPixel(i, j - 1)
cArrayColor(2) = bBitmap.GetPixel(i + 1, j - 1)
cArrayColor(3) = bBitmap.GetPixel(i - 1, j)
cArrayColor(4) = bBitmap.GetPixel(i, j)
cArrayColor(5) = bBitmap.GetPixel(i + 1, j)
cArrayColor(6) = bBitmap.GetPixel(i - 1, j + 1)
cArrayColor(7) = bBitmap.GetPixel(i, j + 1)
cArrayColor(8) = bBitmap.GetPixel(i + 1, j + 1)

念のための確認ですが、shuさんの仰っていたことはこういうことで良かったのでしょうか。

引用返信 編集キー/
■67623 / inTopicNo.4)  Re[3]: ラプラシアンフィルタを用いたエッジ検出プログラム
□投稿者/ 774 (3回)-(2013/08/17(Sat) 12:48:49)
おそらくですが解決しました!shuさんありがとうございました!
>
解決済み
引用返信 編集キー/
■67626 / inTopicNo.5)  Re[3]: ラプラシアンフィルタを用いたエッジ検出プログラム
□投稿者/ shu (368回)-(2013/08/17(Sat) 22:58:06)
No67622 (774 さん) に返信
> 念のための確認ですが、shuさんの仰っていたことはこういうことで良かったのでしょうか。
>
そういうことで良いです。

ところでGetPixelを大きな画像で使用すると処理速度が遅くなってしまうので
LockBitsをして処理をした方がよいかもしれません。

http://msdn.microsoft.com/ja-jp/library/ms229672(v=vs.90).aspx
解決済み
引用返信 編集キー/
■67700 / inTopicNo.6)  Re[4]: ラプラシアンフィルタを用いたエッジ検出プログラム
□投稿者/ 774 (4回)-(2013/08/25(Sun) 18:35:45)
No67626 (shu さん) に返信
> ■No67622 (774 さん) に返信
>>念のための確認ですが、shuさんの仰っていたことはこういうことで良かったのでしょうか。
>>
> そういうことで良いです。
>
> ところでGetPixelを大きな画像で使用すると処理速度が遅くなってしまうので
> LockBitsをして処理をした方がよいかもしれません。
>
> http://msdn.microsoft.com/ja-jp/library/ms229672(v=vs.90).aspx

お答え頂きありがとうございます!LoclBitsでの処理にも是非取り組んでみたいと思います!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -