2017-05-22 13 views
1

これは、私がGayscale画像上でSobelカーネルを使用する方法です。しかし、実際にはカラー画像の修正方法を知りません。カラー画像のエッジ検出CannyAlgorithm

void Soble() 
{ 
Mat img; 
int w = 3; 
int k = w/2; 

char fname[MAX_PATH]; 
openFileDlg(fname); 
img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE); 
gaussianFiltering(img); 
Mat destinationImg = img.clone(); 
float sobelY[3][3] = { 1, 2, 1, 0, 0, 0, -1, -2, -1 }; 
float sobelX[3][3] = { -1, 0, 1, -2, 0, 2, -1, 0, 1 }; 
for (int i = k; i < img.rows - k; i++) 
{ 
    for (int j = k; j < img.cols - k; j++) 
    { 
     float Gx = 0, Gy = 0; 

     for (int l = 0; l < w; l++) 
     { 
      for (int p = 0; p < w; p++) 
      { 
       Gx += img.at<uchar>(i + l - k, j + p - k)*sobelX[l][p]; 
       Gy += img.at<uchar>(i + l - k, j + p - k)*sobelY[l][p]; 
      } 
     } 
     destinationImg.at<uchar>(i, j) = sqrt(Gx*Gx + Gy * Gy)/(4 * sqrt(2)); 

    } 
} 
imshow("Intermediar",destinationImg); 
imshow("Initial", img); 
waitKey(0); 

    } 

私は各RGBシャネルを使用することを考えましたが、それは動作しないし、いくつかのエラーを与えます。

 float GxR = 0, GyR = 0; 
     float GxG = 0, GyG = 0; 
     float GxB = 0, GyB = 0; 

     for (int l = 0; l < w; l++) 
     { 
      for (int p = 0; p < w; p++) 
      { 
       GxR += img.at<Vec3b>[0](i + l - k, j + p - k)*sobelX[l][p]; 
       GxG += img.at<Vec3b>[1](i + l - k, j + p - k)*sobelX[l][p]; 
       GxB += img.at<Vec3b>[2](i + l - k, j + p - k)*sobelX[l][p]; 
       GyR += img.at<Vec3b>[0](i + l - k, j + p - k)*sobelY[l][p]; 
       GyG += img.at<Vec3b>[1](i + l - k, j + p - k)*sobelY[l][p]; 
       GyB += img.at<Vec3b>[2](i + l - k, j + p - k)*sobelY[l][p]; 
      } 
     } 
     destinationImg.at<Vec3b>[0](i, j) = sqrt(GxR*GxR + GyR * GyR)/(4 * sqrt(2)); 
     destinationImg.at<Vec3b>[1](i, j) = sqrt(GxG*GxG + GyB * GyB)/(4 * sqrt(2)); 
     destinationImg.at<Vec3b>[2](i, j) = sqrt(GxG*GxG + GyG * GyG)/(4 * sqrt(2)); 

このコードをどのように書き直す必要がありますか教えてください。

+0

"いくつかのエラー" は何ですか?それは医者に行って、気分が良くないと言っているようなものです。 – Piglet

+0

ErrorC3867 \t 'cv :: Mat :: at':非標準構文。 '&'を使用してメンバーへのポインタを作成 – TufisiRadu

+0

ErrorC2109 \tサブスクリプトに配列またはポインタタイプが必要 – TufisiRadu

答えて

0

あなたは間違った方法で画像データにアクセスします。

destinationImg.at<Vec3b>[0](i, j) 

destinationImgはタイプVec3bのマットです。つまり、それは3次元ベクトルの2次元配列です。

You'r []演算子は、添字のエラーメッセージは、ポインタでも可能ではない配列でもない何かにその演算子を使用していることを示しています...間違った場所に

です。 (i、j)が期待される演算子があるため、他のエラーメッセージが表示されます。

まず、これらのベクトルの1つを取得してから、その要素を取得する必要があります。

destinationImg.at<Vec3b>(i,j)は、i、jにベクトルを与えます。

destinationImg.at<Vec3b>(i,j)[0]は、あなたにそのベクトルの最初の要素を与えます。 OpenCVのドキュメントから

例:

Vec3b intensity = img.at<Vec3b>(y, x); 
uchar blue = intensity.val[0]; 
uchar green = intensity.val[1]; 
uchar red = intensity.val[2]; 

http://docs.opencv.org/2.4.13.2/doc/user_guide/ug_mat.html

関連する問題