본문 바로가기
IT

[opencv][C++ ] Patterning을 이용하여 사진 묘사

by 배애앰이 좋아 2021. 1. 4.
반응형

Patterning 란?

특정 패턴을 반복적으로 이용하여 사진을 묘사하는 방법이다. 이러한 방법을 사용하는 이유는 3x3 마스크 씌워 계산하기 때문에 계산량도 적고 점 찍는 숫자도 줄어든다. 즉, 프린트할 때 점을 적게 찍기 때문에 잉크가 덜 들 수 있다.

 

단점으로는 가로 아니면 세로로 줄 표시가 난다는 점이 있다.

 

아래는 openCV 를 활용해서 C++로 구현한 코드

 

void computePatterning(IplImage *img, IplImage *cpimg) {
	//mask size > 3x3 [0-8]
	//3x3 칙셀에서 한점을 찍는 순서
	int order[] = { 1,8,0,6,2,5,7,3,4 };
	for (int i = 0; i < img->width-2; i+=3) {
		for (int j = 0; j < img->height-2; j+=3) {
			auto c = cvGet2D(img, j, i);
			auto b = (c.val[0] + c.val[1] + c.val[2]) / 3.0;
			int level = (int)(b / 255 * 10);
			for (int k = 0; k < level; k++) {
				int i2 = i + order[k] % 3;
				int j2 = j + order[k] / 3;
				cvSet2D(cpimg, j2, i2, CV_RGB(255,255,255));
			}
		}
	}
}

 

위 코드 결과 사진 : 

 

 

고양이 그림이 일정 반복적인 패턴을 가지고 묘사된 것을 확인할 수 있다.

 

 

다른 그림도 잘 나오는 것을 확인할 수 있다.

 

반응형

댓글