이것은 내가 GLESCALE 이미지에서 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));
이 코드를 어떻게 다시 작성해야합니까?
"몇 가지 오류"무엇인가? 그것은 의사에게가는 것과 같고 단지 기분이 좋지 않는다고 말하는 것과 같습니다. – Piglet
ErrorC3867 \t 'cv :: Mat :: at': 비표준 구문; '&'를 사용하여 멤버에 대한 포인터를 만듭니다 – TufisiRadu
ErrorC2109 \t 아래 첨자에는 배열 또는 포인터 유형이 필요합니다 – TufisiRadu