이미지에서 지우고 싶은 선 또는 잡음을 포함한 객체를 지우고,
주변 픽셀이 가지는 색상으로 지워진 부분을 채우고자 할 때
OpenCV의 inpaint 함수를 사용 할 수 있다. (여기서는 OpenCV 3.4.2 버전을 사용하였다.)
inpaint 함수 형식
// C++ 형식 void cv::inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags) // Python 형식 dst = cv.inpaint(src, inpaintMask, inpaintRadius, flags[, dst])
inpaintMask 는 8비트 1채널 이미지(흑백이미지)를 사용해야한다.
inpaintRadius 는 알고리즘에 의해 각 포인트의 circular neighborhood 의 Radius 를 뜻한다.
flags 는 두 가지 종류가 있다.
1. INPAINT_NS
Bertalmio, Marcelo, Andrea L. Bertozzi, and Guillermo Sapiro. "Navier-stokes, fluid dynamics, and image and video inpainting." In Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on, vol. 1, pp. I-355. IEEE, 2001.
2. INPAINT_TELEA
Telea, Alexandru. "An image inpainting technique based on the fast marching method." Journal of graphics tools 9.1 (2004): 23-34.
위 그림의 좌 상단 그림에 불필요한 직선이 포함되어있다.
이와 같은 직선을 별도의 방법(이진화, 직선검출 등)을 사용하여 검출한 뒤,
우 상단 그림과 같이 마스크(Mask)를 생성해준다.
그 다음 OpenCV의 inpaint 함수를 통해 좌 하단, 우 하단 과 같은 결과를 낼 수 있다.
좌 하단 이미지는 inpaint 함수의 다섯번째 인수인 flag = INPAINT_NS 값을 적용한 예제 이고,
우 하단 이미지는 inpaint 함수의 다섯번째 인수인 flag = INPAINT_TELEA 값을 적용한 예제이다.
이를 Dermatoscopic images 에 적용하여 hair 를 지우는 예제이다.
- Dermatoscopic images 는 HAM10000 dataset 을 이용하였다.
핵심 코드
inpaint(inpainted, mask, dst, 3, INPAINT_NS); namedWindow("inpaint"); imshow("inpaint", dst);
아래 이미지는 INPAINT_TELEA 를 적용한 예시이다.
별도의 방법을 적용하여 mask 를 생성 한 뒤
우 상단 이미지 처럼 hair 를 제거하였다.
하단 이미지는 각각 hair 를 제거하고 상처 부위를 탐지한 결과와,
hair 를 제거하지 않았을 때의 상처 부위를 탐지한 결과를 나타낸다.
아래 이미지는 INPAINT_NS 를 적용한 예제이다.
OpenCV 참고자료 1 : https://docs.opencv.org/3.4.2/df/d3d/tutorial_py_inpainting.html
OpenCV 참고자료 2 : https://docs.opencv.org/trunk/d1/d0d/group__photo.html
Inpainting 내용 참고자료 1 : https://github.com/sooham/inpainting
Inpainting 내용 참고자료 2 : http://www.irisa.fr/vista/Papers/2004_ip_criminisi.pdf
hair 를 제거하는 응용 프로그램 DullRazor : http://www.dermweb.com/dull_razor/
hair 제거 관련 논문 : http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.1006.4419&rep=rep1&type=pdf
'Programming > OpenCV' 카테고리의 다른 글
[OpenCV] putText 폰트 c++ (0) | 2018.10.18 |
---|---|
[OpenCV] 특정 픽셀 값 접근하기 (0) | 2018.09.07 |
[OpenCV] 동영상 저장 및 파일명 지정 (to_string) (0) | 2017.08.17 |
[OpenCV] Image Denoising (0) | 2017.02.16 |
[OpenCV] Bilateral Filter 적용하기 (0) | 2017.02.15 |