일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- opencv SURF
- 딥러닝
- #opencv
- tensorflow update
- object detection
- python __init__
- findContours
- 영어
- #English
- #영어
- #프로젝트
- Convolution Neural Network
- #일상영어
- keras
- c언어
- #실생활 영어
- #실생활영어
- 완전탐색
- word embedding
- #Android
- #영어 명언
- text2img
- convexhull
- #1일1영어
- python 알고리즘
- python list
- 영어명언
- 이미지 생성
- TensorFlow
- tokenizing
- Today
- Total
When will you grow up?
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씩 값을 증가 감소 시키면서 변화를 주게 되면 이미지 블랜딩 처리가 끝이 난다.
처리된 이미지는 위 파일과 같이 처리가 됨니다.
'02. Study > Computer Vision(openframworks&opencv)' 카테고리의 다른 글
GaussianBlur 를 이용한 이미지 필터링 (0) | 2016.09.24 |
---|---|
9.Image Histogram만들기 & GaussianBlur를 적용시킨 Histogram (0) | 2016.09.23 |
6. LUT를 이용한 속도 비교(ColorReduction / ColorReductionLUT) (0) | 2016.09.17 |
5. ColorReduction 만들기. (0) | 2016.09.17 |
4. BitPlane 함수 만들기(Bit-Plane Slicing) (0) | 2016.09.17 |