7.LinearBlending(이미지 블랜딩)
이번시간에는
두장의 이미지가 있을때 이미지를 섞는방법을 해볼예정입니다
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씩 값을 증가 감소 시키면서 변화를 주게 되면 이미지 블랜딩 처리가 끝이 난다.
처리된 이미지는 위 파일과 같이 처리가 됨니다.