[VB.NET] 차근차근 OpenCVSharp 강좌 - 16. 이미지 비트연산

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

이미지 비트연산은 각 컬러값을 이진수로 변환후 비트별 연산을 수행하게 된다. And, Or, Not, Xor 이렇게 네개의 연산자를 제공하며 각각 BitwiseAnd, BitwiseOr, BitwiseNot, BitwiseXor의 함수명으로 제공된다.

이번 강좌에서 비트연산에 대한 개념은 별도로 다루지 않으니 비트연산에 대해서 모르시는 분들은 검색해서 내용 숙지후 이 강좌를 봐주시기 바란다.

메인폼에 버튼 추가 - Name : ButtonBitwise, Text : Bitwise

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

Private Sub ButtonBitwise_Click(sender As Object, e As EventArgs) Handles ButtonBitwise.Click
    Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Color), dst As New Mat
    Dim val As New Mat("D:\test\carnation.jpg", ImreadModes.Color)
    Cv2.BitwiseAnd(org, val, dst)
    PictureBoxOrg.Image = org.ToBitmap : PictureBoxDst.Image = dst.ToBitmap
End Sub

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

OpenCVSharp - BitwiseAnd

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

원본과 대상 이미지 매트릭스 선언

Line 2 : Dim val As New Mat("D:\test\carnation.jpg", ImreadModes.Color)

연산할 이미지 매트릭스 선언

Line 3 : Cv2.BitwiseAnd(org, val, dst)

org와 val 이미지를 비트 And 연산 처리해서 결과를 dst에 넣는다. And 연산은 우리가 이미 알고 있는 And 연산과 동일하다. 1 And 1 = 1, 1 And 0 = 0, 0 And 0 = 0 이거 말이다. 그냥 컬러값을 이진수로 풀어서 And 연산후 다시 컬러값으로 변환한 결과를 구하는 것이다.

 

Line 4 : PictureBoxOrg.Image = org.ToBitmap : PictureBoxDst.Image = dst.ToBitmap

결과를 화면에 뿌린다.

사실 이진 연산이라는 말은 아주 쉽고 계산도 아주 쉽다. 하지만, 이미지끼리 이진 연산을 했을 경우 그 결과를 예측하기는 쉽지 않다. 그러니 하나씩 해보자.

위 Line 3의 BitwiseAnd를 BitwiseOr로 바꾸면 아래와 같은 이미지가 나온다. 두 이미지를 적절히 합성한듯 하다.

OpenCVSharp - BitwiseOr

BitwiseNot은 파라미터로 하나의 이미지만 있으면 된다. org 이미지를 파라미터로 넣으면 아래 화면처럼 반전 이미지가 들어가게 된다.

OpenCVSharp - BitwiseNot

위 Line 3의 BitwiseAnd를 BitwiseXor로 바꾸면 아래와 같은 이미지가 나온다.

OpenCVSharp - BitwiseNor

결국 이미지를 비트연산 하게되면 두 이미지를 합성하게 되니 이전 강좌의 덧셈, 뺄셈 등의 함수와 비슷한 결과를 내며 실제 내부적으로도 비슷한 동작을 하게 된다.

반응형