When will you grow up?

7.LinearBlending(이미지 블랜딩) 본문

02. Study/Computer Vision(openframworks&opencv)

7.LinearBlending(이미지 블랜딩)

미카이 2016. 9. 23. 14:52

이번시간에는

두장의 이미지가 있을때 이미지를 섞는방법을 해볼예정입니다

Blending 섞는다. 라는 의미로 

두장의 이미지를 겹치거나 서서히 바뀌는것을 해볼 것입니다.


일단 준비물 : 두장의 크기가 같은 서로 다른 이미지 파일을 준비


이미지 로드는

openframeworks ->ofImage 를 이용하여 

Mat형식으로 이미지를 서로 섞어 

openCV ->imshow() 함수를 이용하여 이미지를 바뀌는 모습을 출력 헐 예정입니다.




ofImage src1_1, src2_2;         //Image File 를 선언해주시고

Mat src1, src2, blended;         //Mat형식의 원본이미지 2개와 섞여서 출력될 1개를 선언시켜줌니다.


src1_1.load("image_1.jpg");

src2_2.load("image_2.jpg");

이미지를 로드 합니다.



blended_1.clone(src1_1);

src1 = cv::Mat(src1_1.getHeight(), src1_1.getWidth(), CV_8UC3, src1_1.getPixels().getData());

src2 = cv::Mat(src2_2.getHeight(), src2_2.getWidth(), CV_8UC3, src2_2.getPixels().getData());

blended = cv::Mat(blended_1.getHeight(), blended_1.getWidth(), CV_8UC3, blended_1.getPixels().getData());



섞일 이미지에 첫번째 원본데이터 값을 복사해주시고 Mat형식으로 변환시켜 줍니다.


그럼 이제 기본적인 준비는 끝났으며, 


핵심!!!!!

myLinearBlending 라는 함수를 만들어 보겠습니다.


void myLinearBlending(Mat &f, Mat &g ,Mat &h, float alpha);    //함수의 원형 입니다

   //첫번째 이미지 ,2번째

  //이미지 섞일 이미지

  //alpha 값


alpha값을 지속적으로 변화시켜 saturate_cast 함수를 이용하여 0~255까지 픽셀값이 있을텐데 0이하일경우는 0으로 255이상일 경우는 255로 변환을 시켜줄 것을 할것입니다.





void myLinearBlending(Mat &f, Mat &g ,Mat &h, float alpha)

{

Mat_<Vec3b> Ping = Mat_<Vec3b>(f);

Mat_<Vec3b> Ging = Mat_<Vec3b>(g);

Mat_<Vec3b> Ring = Mat_<Vec3b>(h);


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

{

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

{

Vec3b pp = Ping(r, c);

Vec3b pg = Ging(r, c);

Vec3b pr ;


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

{

float ws = pg[k] * alpha + (1 - alpha) * pp[k];

pr[k] = saturate_cast<uchar>(ws+0.5f);

}

Ring(r, c) = pr;

}

}

return;

}


함수의 내용은 이렇게 됩니다.

해석 하자면 각각의 행 렬 값을 순회한 값을 Vec3b형 pp,pg에 넣어주며 

ws = 두번째이미지 픽셀값 * alpha + (1- alpha) * 첫번째이미지 픽셀값;

이렇게 되면 ws값이 두 이미지 사이 값에서 계속 왔다갔다 거릴것이다

그리고 pr[k]값에다가 넣어주면 끝.

pr는 바뀔이미지에다가 넣어주니깐 준비끝



void ofApp::update() {

myLinearBlending(src1, src2, blended, alpha);

alpha = alpha + offset;

imshow("Combination", blended);

if (alpha > 1)

{

alpha = 1;

offset *= -1;

}

if (alpha < 0)

{

alpha = 0;

offset *= -1;

}

cout << alpha << endl;

}

업데이트 문은 위에 같다. 함수를 호출하고 alpha값을 0.01씩 값을 증가 감소 시키면서 변화를 주게 되면 이미지 블랜딩 처리가 끝이 난다.



처리된 이미지는 위 파일과 같이 처리가 됨니다.


Comments