2017-08-09 10 views
3

ソベル演算子を垂直方向に実装しました。しかし、私が得ている結果は非常に貧しいです。私は以下のコードを添付しています。アルゴリズムへSobel演算子の実装方法

int mask_size= 3; 

char mask [3][3]= {{-1,0,1},{-2,0,2},{-1,0,1}}; 

ボイドソーベル(マットinput_image) {

/**Padding m-1 and n-1 zeroes to the result where m and n are mask_size**/ 

Mat result=Mat::zeros(input_image.rows+(mask_size - 1) * 2,input_image.cols+(mask_size - 1) * 2,CV_8UC1); 
Mat result1=Mat::zeros(result.rows,result.cols,CV_8UC1);    
int sum= 0; 

/*For loop for copying original values to new padded image **/ 

for(int i=0;i<input_image.rows;i++) 
    for(int j=0;j<input_image.cols;j++) 
     result.at<uchar>(i+(mask_size-1),j+(mask_size-1))=input_image.at<uchar>(i,j); 

GaussianBlur(result, result, Size(5,5), 0, 0, BORDER_DEFAULT); 
/**For loop to implement the convolution **/ 

for(int i=0;i<result.rows-(mask_size - 1);i++) 
    for(int j=0;j<result.cols-(mask_size - 1);j++) 
    { 
     int counter=0; 
     int counterX=0,counterY=0; 
     sum= 0; 
     for(int k= i ; k < i + mask_size ; k++) 
     { 
      for(int l= j ; l< j + mask_size ; l++) 
      { 
       sum+=result.at<uchar>(k,l) * mask[counterX][counterY]; 
       counterY++; 
      } 
      counterY=0; 
      counterX++; 
     } 
     result1.at<uchar>(i+mask_size/2,j+mask_size/2)=sum/(mask_size * mask_size); 
    } 

/** Truncating all the extras rows and columns **/ 

result=Mat::zeros(result1.rows - (mask_size - 1) * 2, result1.cols - (mask_size - 1) * 2,CV_8UC1); 
for(int i=0;i<result.rows;i++) 
    for(int j=0;j<result.cols;j++)      
     result.at<uchar>(i,j)=result1.at<uchar>(i+(mask_size - 1),j+(mask_size - 1)); 

imshow("Input",result); 
imwrite("output2.tif",result); 

}

私の入力はenter image description here

私の出力は私も試みたenter image description here

ありますユアンガウスブルーウル実際に画像や私が得た出力を畳み込む前に、私は期待していenter image description here

出力は、私が使用していますenter image description here

ガイドがあるされている:私は持っていたもののhttps://www.tutorialspoint.com/dip/sobel_operator.htm

+1

正直言って、それは私にはうまく見えます。 Sobelを実行する前に、画像にガウスぼかしを適用してみてください。それは不安のいくつかを滑らかにするはずです。 – ljetibo

+0

ガウスぼかしで試してみましたが、うまくいきませんでした。次回は出力が – Abhishek

+1

の上にハイライト表示されますので、時間をかけてコードをイメージとしてではなくコードとして入力して、他の人がコピーできるようにしてください。 – Piglet

答えて

1

あなたの畳み込みは大丈夫に見えますちょっと見に来ます。

出力タイプを確認してください。それは無署名のcharです。

ここで、負のカーネル値があり、それを直接ucharに格納することをお勧めします。

符号なしの文字に-1を格納すると、ラップされ、出力は255になります。余分な白いものがどこから来ているのか疑問に思っている場合。それは実際には小さな負の勾配です。

希望の結果は、Sobel出力値の絶対値のように見えます。

+0

あなたは何をすべきかお勧めできますか?ピグレットとは何ですか?sobelの絶対値で何をするのですか? – Abhishek

+0

@Abhishekあなたの数学スキルがひどい場合は、 。 https://en.wikipedia.org/wiki/Absolute_value – Piglet

+1

@Abhishek私は失礼を意味しませんでした。これはちょうどアドバイスでした。あなたは、プログラミングの生活を必要以上に困難にします。 5文字しか知らないときは、本を読むようなものです。あなたは物語の感覚を作ることができず、またそれを完全に楽しむこともありません。なぜ私は大学での画像処理研究で4年間90%の数学を費やしたと思いますか?数字の絶対値は「正のバージョン」です。 -1は1になり、1は0になり、0は0になります。 - 5は5です...スクリーンに負の数を表示することはできませんので、何らかの形で修正する必要があります。例えばそれらの絶対値を表示することによって実行される。 – Piglet

関連する問題