When will you grow up?

5. ColorReduction 만들기. 본문

02. Study/Computer Vision(openframworks&opencv)

5. ColorReduction 만들기.

미카이 2016. 9. 17. 17:35

ColorReduction ->말 그대로 컬러 이미지에서 색상 감축을 위하여 쓰는 알고리즘 입니다.



해당 중요 함수 부분입니다.

cv::Mat myColorReduction(Mat &srcImg, int cw)

{

Mat_<Vec3b> destImg = Mat_<Vec3b> (srcImg.clone());


for (int r = 0; r < srcImg.rows; r++)

{

for (int c = 0; c < srcImg.cols; c++)

{

Vec3b rgb = destImg(r,c);

for (int k = 0; k < 3; k++)

{

rgb[k] = int(rgb[k] / cw) * cw;

}

destImg(r, c) = rgb;

}

}

return destImg;

}


이중포문을 사용하여 전체 이미지를 스캔하고

가로 픽셀수와 세로픽셀수를 얻기위해 rows 과 cols을 이용한다.

Vec3b 원형은 이렇게 생겼다.

typedef Vec<uchar, 3> Vec3b; //Vec3b 형식은 이렇게 정의가 된다.

rgb[k] = int(rgb[k] / cw) * cw;

이부분에서

흑백일경우는 상관이 없지만 컬러 이미지 이므로 R G B가 존재 하므로 이를 처리하기 위해서 나눈후에 다시 곱하므로 기존값에 나머지를 뺀 값이 남게 된다.

예를들어 1024엿을경우 100으로 나누고 100을 다시 곱하게 되면 : 1000의 값이 나오게 됨



결과입니다.

왼쪽이 원본 이미지 오른쪽이 reduction된 이미지.



전체 코드는 아래와 같습니다.



#include "ofApp.h"

const int width = 720;
const int height = 480;
unsigned char pixel[width*height * 3];
ofImage img, result;
ofImage photo;

Mat srcImg;



cv::Mat myColorReduction(Mat &srcImg, int cw)
{
	Mat_ destImg = Mat_ (srcImg.clone());

	for (int r = 0; r < srcImg.rows; r++)
	{
		for (int c = 0; c < srcImg.cols; c++)
		{
			Vec3b rgb = destImg(r,c);
			for (int k = 0; k < 3; k++)
			{
				rgb[k] = int(rgb[k] / cw) * cw;
			}
			destImg(r, c) = rgb;
		}
	}
	return destImg;
}



//--------------------------------------------------------------
void ofApp::setup() {
	photo.load("myimage2.jpg");
	
	srcImg = Mat(photo.getHeight(),photo.getWidth(),CV_8UC3,photo.getPixels().getData());
	
	Mat colorReduced = myColorReduction(srcImg, 64); //이렇게 100으로 나누면 27가지 컬러 표현이 가능하다
	
	imshow("colorReduction", colorReduced);
	
}

//--------------------------------------------------------------
void ofApp::update() {
	photo.update();

}

//--------------------------------------------------------------
void ofApp::draw() {
	photo.draw(100, 100);
	//result.draw(photo.getWidth() + 100, 100);
}

//--------------------------------------------------------------
void ofApp::keyPressed(int key) {
	
}

//--------------------------------------------------------------
void ofApp::keyReleased(int key) {

}

//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y) {

}

//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button) {

}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button) {

}

//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button) {

}

//--------------------------------------------------------------
void ofApp::mouseEntered(int x, int y) {

}

//--------------------------------------------------------------
void ofApp::mouseExited(int x, int y) {

}

//--------------------------------------------------------------
void ofApp::windowResized(int w, int h) {

}

//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg) {

}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo) {

}



Comments