[VB.NET] 차근차근 OpenCVSharp 강좌 - 8. 픽셀 더하기

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

메인폼에 버튼 추가 - Name : ButtonAdd, Text : Add

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

Private Sub ButtonAdd_Click(sender As Object, e As EventArgs) Handles ButtonAdd.Click
    Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Color), dst As New Mat
    Dim val As New Mat(org.Size(), MatType.CV_8UC3, New Scalar(0, 0, 30))
    Cv2.Add(org, val, dst)
    PictureBoxOrg.Image = org.ToBitmap : PictureBoxDst.Image = dst.ToBitmap
End Sub

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

OpenCVSharp - 픽셀 더하기

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

원본 및 대상 이미지 선언

Line 2 : Dim val As New Mat(org.Size(), MatType.CV_8UC3, New Scalar(0, 0, 30))

픽셀을 더해줄 스칼라 값 생성. 픽셀 더하기는 두개의 이미지끼리 할수도 있고, 하나의 이미지와 하나의 스칼라값을 더할 수도 있다. 여기서 주의할 사항은 Scalar의 파라미터인 0, 0, 30이 순서대로 B, G, R 이라는 것이다. 우리가 일반적으로 사용하는 RGB가 아닌 BGR의 순서이니 그것만 주의하면 된다.
따라서 이 구문은 원본 이미지의 각 픽셀에 모두 빨강을 30만큼 더해서 연산하라는 것이고, 30을 더했을때 255가 넘어가면 알아서 255로 세팅해주니 별다른 오류처리는 할 필요가 없다. OpenCVSharp이 알아서 예외처리를 해준다.

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

원본 이미지에 스칼라 값을 더해서 결과를 대상이미지에 저장해준다. 이 결과 빨강값을 30 더해서 결과 이미지가 좀더 빨강에 가깝게 변환된다.

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

최종 결과를 화면에 뿌려주면 픽셀 더하기는 마무리가 된다.

가능하면 모든 강좌의 예제를 거의 비슷하게 만들고 있다. 뭐든 계속 반복해야 더 정확히 알게 될테니까...
강좌는 이렇게 간단하게 마무리짓지만 예제를 만들어서 직접 해볼때는 여러 스칼라값도 변경해서 결과를 확인해보고, 스칼라 대신 다른 이미지와도 연산을 해보자. 다른 이미지와의 덧셈은 두 이미지의 각 픽셀들을 더해주니 두개의 이미지가 겹쳐 보이는 결과가 나오게 된다.

위 예제에서 Scalar(0, 0, 30)을 (30, 0, 0)으로 변경하면 아래 화면이 된다. 좀더 파랑에 가까워졌나? 별로 티가 안나면 값을 좀더 키워서 다시 해보면서 변화를 명확히 알아갈 필요가 있다.

OpenCVSharp - 파랑 픽셀 더하기

이걸 그대로 (0, 30, 0)으로 변경하면 아래 화면이 된다.

OpenCVSharp - 녹색 픽셀 더하기

좀더 녹색과 가까워진게 확인이 될것이다. BGR 순서라는것을 다시한번 기억하자.

이쯤되니 조금 궁금해져서 두개 이미지를 더하면 어떤 결과가 나오나 보자. 두번째 이미지는 일부러 빨강이 많이 들어있는 이미지를 택했다. 이참에 첫번째 이미지도 원본으로 다시 확인해보자.

OpenCVSharp - 원본 이미지 1
OpenCVSharp - 원본이미지 2

이 두개 이미지를 더해주면 결과가 아래와 같이 나온다.

OpenCVSharp - 두개 이미지 더하기

이미 예상했듯 정말로 두개의 이미지를 더해서 겹쳐보이는 결과가 나왔다. 잘 활용하면 이미지 합성은 아주 쉽게 처리가 가능하다.

반응형