#Grip 9기# 일기_0930 - [안드로이드]비트맵 노이즈 필터

JH·2022년 9월 30일
0

인턴

목록 보기
12/25
post-thumbnail

오늘은 비트맵 사진의 노이즈를 제거하는 필터를 구현하였다.

주름의 사진을 찍고 인공지능을 이용하여 주름을 나타내었는데 인공지능이 임의로 주름을 측정하다 보니 지저분한 노이즈가 생겨 제대로 확인이 어려웠다.

파이썬으로는 코드가 잘 나와있는데 자바에서는 코드가 나오질 않아 상당히 많은 시간을 썼다.

처음에는 canny를 이용하여 윤곽선을 따고 그 용량이 적은 부분을 제거하는 코드를 작성하려 했는데 무슨 이유에서인지 자꾸 오류가 나서 실패했다.
line.total의 변수가 초기화가 되질 않아 for문이 실행이 되질 않고 그냥 진행이 되어 작동을 하지 않았다.

그 후에 생각한 방법은 houghlinesp 필터를 이용하여 직선을 검출한 후 그것을 출력하는 방법을 택했다. 일정 크기 이상의 직선만 추출하면 주름만이 추출될 것이라고 생각하였다.
하지만 그것 또한 실패하였다.

최후의 수단으로 생각한것은 노이즈 필터링의 방법이었다. 비트맵을 erode 후에 다시 dilate를 하였다. 이 방법은 노이즈 뿐만 아니라 주름의 크기가 작을경우 같이 필터링이 되기 때문에 위험성이 있어 사용하지 않으려 했지만 방법이 이것밖에 남아있지 않았다.

그래서 최대한 알맞는 비율로 erode 했으며 후에 dilate를 했다. 다행히 우려한 위험은 생각보다 덜 나타났고 결과는 생각보다 좋게 출력이 되었다.

작성코드

OpenCVLoader.initDebug();
Mat mat_predict = new Mat();
Utils.bitmapToMat(bitmap_predict, mat_predict);
            
mgproc.erode(mat_predict, mat_predict, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(4, 4)));
Imgproc.dilate(mat_predict, mat_predict, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1)));
            
Utils.matToBitmap(mat_predict,bitmap_predict);
Glide.with(this).load(bitmap_predict).into(after_filter);

결과

-> 필터 전

-> 필터 후

0개의 댓글