OpenCV | 평균값 필터 컨볼루션 연산하기(함수 없이 블러링하기)

박나연·2021년 4월 5일
0

OpenCV

목록 보기
24/40

void filter_blur() {

	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Mat dst = imread("rose.bmp", IMREAD_GRAYSCALE);
	//Mat mask = Mat::ones(5, 5, CV_32FC1);
	//Mat mask(Size(5, 5), CV_32FC1, 1/25);
	int mask[5][5] = { { 1,1,1,1,1 },
						{ 1,1,1,1,1 },
						{ 1,1,1,1,1 },
						{ 1,1,1,1,1 },
						{ 1,1,1,1,1 } };

	int sum;
	for (int y = 0; y < src.rows; y++) { //행 결과영상
		for (int x = 0; x < src.cols; x++) { //열
			sum = 0;
			for (int i = -2; i <= 2; i++) { // -2 -1 0 1 2
				for (int j = -2; j <= 2; j++) {
					int ny = y + i; 
					int nx = x + j;

					if (ny < 0) // 가장자리 픽셀
						ny = 0;
					else if (ny > src.rows - 1) 
						ny = src.rows - 1;

					if (nx < 0) 
						nx = 0;
					else if (nx > src.cols - 1) 
						nx = src.cols - 1;

					sum += src.at<uchar>(ny, nx) * mask[2 + i][2 + j];
					//sum += src.at<uchar>(ny, nx) * mask.at<uchar>(2 + i, 2 + j);
	
				}
			}
			sum = sum / 25;

			if (sum > 255) // 포화연산
				sum = 255; 
			if (sum < 0) 
				sum = 0;

			dst.at<uchar>(y, x) = sum; 
		}
	}

	imshow("src", src);
	imshow("dst", dst);
	waitKey();
	destroyAllWindows();
}

결과영상의 원소값에 sum을 넣을때 at함수를 쓰니 자꾸 오류가 났다.
디버깅으로 오류의 원인을 찾아보니 dst객체에 아무것도 들어 있지 않아서 였다. 그래서 처음에 dst에 입력 영상을 저장하고 나중에 원소값을 바꾸는 방식으로 진행했다.

마스크 행렬을 int 배열로 지정했을때는 성공적으로 작동하였는데 Mat로 행렬을 만들어 연산을 진행하니 작동하지 않았다. 이유를 아직 발견하지 못했다.

profile
Data Science / Computer Vision

0개의 댓글