[VB.NET] 차근차근 OpenCVSharp 강좌 - 13. 모자이크 처리

2023. 1. 25. 09:00VB.NET/OpenCVSharp

모자이크는 어떻게 구현하는걸까? 이전 강좌에서 잠깐 그 힌트를 얻을 수 있는 강좌가 있었는데 바로 이미지 확대/취소에서 힌트를 얻을 수 있다. 모자이크는 원하는 영역만큼을 축소한 후에 축소된 부분을 다시 확대하면 이미지 보간법에 의해 모자이크 처리가 되서 보이게 된다.

이미지 전체를 다 모자이크 처리한 결과는 이미지 축소/확대 강좌에서 확인해 보면 되겠고, 이번 강좌에서는 우리 다람쥐의 눈부분만 모자이크 처리해보자. 뉴스에서 모자이크 처리하는 그 방식이랑 비슷하다.

아래 사진 영역만 모자이크 처리해보자. 하다보니 눈이 한개밖에 없어서 좀 아쉽지만 그냥 그대로 진행해보자.

OpenCVSharp - 모자이크 1

이 영역의 좌표는 (990,360 ~ 1320,440)이다. 이 좌표부분만 축소후 확대하면 된다. (Left: 990, Top: 360, Width: 1320-990=330, Height: 440-360=80

메인폼에 버튼 추가 - Name : ButtonMosaic, Text : Mosaic

버튼클릭 이벤트에 아래 소스를 추가해서 확인해보자.

Private Sub ButtonMosaic_Click(sender As Object, e As EventArgs) Handles ButtonMosaic.Click
    Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Color)
    Dim dst, small As New Mat : org.CopyTo(dst)
    Cv2.Resize(dst(New Rect(990, 360, 330, 80)), small, Nothing, 0.05, 0.05, InterpolationFlags.Nearest)
    Cv2.Resize(small, dst(New Rect(990, 360, 330, 80)), New OpenCvSharp.Size(330, 80), InterpolationFlags.Nearest)
    PictureBoxOrg.Image = org.ToBitmap : PictureBoxDst.Image = dst.ToBitmap
End Sub

프로젝트 실행후 Mosaic 버튼을 누르면 아래 화면과 같이 결과가 나와야 성공

OpenCVSharp - 모자이크 결과

이전 강좌들에 비해 조금 복잡해졌다. 앞으로 더 복잡한것도 많으니 일단 한줄한줄 차근차근 알아보도록 하자.

Line 1 : Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Color)

이건 이제 더이상 설명하지 않겠다. 혹시 이 구문이 이해가 안되시는 분은 이전 강좌를 참조하시길...

Line 2 : Dim dst, small As New Mat : org.CopyTo(dst)

대상 매트릭스와 모자이크처리할 작은 매트릭스를 하나 선언한다. 그리고, 원본을 그대로 대상에 복사해놓자. 다람쥐 눈 부위만 일부 모자이크 처리해야 하니 일단 원본을 복사해놓고, 눈 부위만 축소했다가 다시 확대하면 완성이다.

Line 3 : Cv2.Resize(dst(New Rect(990, 360, 330, 80)), small, Nothing, 0.05, 0.05, InterpolationFlags.Nearest)

여기가 조금 난해하니 제대로 살펴보자. 우선 Cv2.Resize 함수를 써서 이미지 크기를 변경해준다는건 알겠다. 

1. 첫번째 파라미터 : dst(New Rect(990,360, 330, 80))
  원본이미지의 특정영역 - 저 위에 빨간색 네모칸 쳐놓은 부분이다. 이부분만 모자이크 처리해줘야 하니 위치와 크기를 특정했다.

2. 두번째 파라미터 : small
  이건 Resize 함수의 대상 매트릭스다. 즉, 첫번째 파라미터의 영역을 뒷쪽 파라미터로 인해서 크기조절을 한 결과를 여기에 담는다.

3. 세번째 파라미터 : Nothing
  원래 사이즈가 들어가야 하는데 ratio로 크기를 조절할때는 Nothing이 들어가야 한다.

4. 네번째 파라미터 : 0.05
  fx - X 방향 축소 비율

5. 다섯째 파라미터 : 0.05
  fy - Y 방향 축소 비율

6. 여섯째 파라미터 : InterpolationFlags.Nearest
  이미지를 축소할때의 플래그로 Nearest로 사용하면 바로 근처에 있는 픽셀로 보간법을 실시하게 된다.

이렇게 사용하면 모자이크를 처리하려는 부분만 떼어서 0.05의 비율로 small 매트릭스에 넣는다.

Line 4 : Cv2.Resize(small, dst(New Rect(990, 360, 330, 80)), New OpenCvSharp.Size(330, 80), InterpolationFlags.Nearest)

위 Line 3에서 축소한 이미지를 다시 확대해서 원래 이미지에 덮어씌우면서 자연스럽게 모자이크 처리가 되게 된다. 확대할때는 Size만 제대로 적어주면 된다.

캡처화면을 살펴보면 이게 실제 모자이크가 된건지 흐릿하게 나왔다고 생각할 수 있는데 이유는 큰 이미지를 작은 픽처박스에 넣어놔서 그렇게 보이는것 뿐이다. 제대로 확인하려면 파일로 저장해보면 가장 정확하다.

파일 저장은 Cv2.ImWrite("d:\test\mosaic.jpg", dst) 이렇게 한줄로 된다.

아래 이미지를 확인해보자.

이미지 모자이크 처리는 나름 많은 곳에서 사용되는 기능이니 잘 알아두도록 하자.

반응형