/ / Ostrzenie za pomocą filtru Gaussian 3x3 działa, ale wynikiem są białe piksele - opencv, przetwarzanie obrazu, gaussia, splot

Ostrzenie za pomocą filtru Gaussian 3x3 działa, ale wynikiem są białe piksele - opencv, przetwarzanie obrazu, gaussia, splot

Poniższy program nie działa. Wdrażam filtr Gaussa 3x3, aby wyostrzyć plik obrazu FACE DETECTION.png, ale wynikiem jest tylko biały kolor. Myślę, że wartość sumy jest większa niż 255 w operacji splotu. Potrzebuję rozwiązania ...

KOD:

int main()
{

Mat src, dst;
float sum;

/// Load an image
src = imread("FACE DETECTION.png", 0);

if( !src.data )
{ return -1; }

// define the kernel
float Kernel[3][3] = {
{1.0, 2.0, 1.0},
{2.0, 4.0, 2.0},
{1.0, 2.0, 1.0}
};
dst = src.clone();
for(int y = 0; y < src.rows; y++)
for(int x = 0; x < src.cols; x++)
dst.at<uchar>(y,x) = 0.0;
//convolution operation
for(int y = 1; y < src.rows - 1; y++){
for(int x = 1; x < src.cols - 1; x++){
sum = 0.0;
for(int k = -1; k <= 1;k++){
for(int j = -1; j <=1; j++){
sum = sum + Kernel[j+1][k+1]*src.at<uchar>(y - j, x - k);
sum = sum>255? 255:sum;
sum = sum<0? 0:sum;
}
}
dst.at<uchar>(y,x) = sum;
}
}


namedWindow("final");
imshow("final", dst);

namedWindow("initial");
imshow("initial", src);

waitKey();


return 0;
}

Odpowiedzi:

1 dla odpowiedzi № 1

Problem stanowi jądro. Suma jądra powinna być równa jednej, ale Twoja równa się 16.

kernel = 1/16* kernel;

naprawi twój problem.