VB.NET/OpenCVSharp
[VB.NET] 차근차근 OpenCVSharp 강좌 - 6. 이진화
차칸아이
2023. 1. 18. 09:00
이진화라... 뭐 이름이 어렵지만 별거 아니다. 픽셀의 특정색을 기준(임계값)으로 위아래로 나눠서 흰색과 검정색으로만 결과를 만들어주는걸 이진화라고 한다. 그러고 보니 이름이 어렵지도 않네 ㅋㅋ. 이진화를 시킬때는 일반적으로 Gray 이미지로 변경후 이 Gray 이미지를 이진화하는게 더 깔끔한 결과를 얻을 수 있다.
메인폼에 버튼 추가 - Name : ButtonBinary, Text : Binary
버튼 클릭 이벤트에 아래 소스를 추가해서 확인해보자.
Private Sub ButtonBinary_Click(sender As Object, e As EventArgs) Handles ButtonBinary.Click
Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Color), gray, dst As New Mat
Cv2.CvtColor(org, gray, ColorConversionCodes.BGR2GRAY)
Cv2.Threshold(gray, dst, 150, 255, ThresholdTypes.Binary)
PictureBoxOrg.Image = org.ToBitmap : PictureBoxDst.Image = dst.ToBitmap
End Sub
프로젝트 실행후 Binary 버튼을 누르면 아래 화면과 같이 결과가 나와야 성공
Line 1 : Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Color), gray, dst As New Mat
원본, 그레이, 대상 매트릭스 선언
Line 2 : Cv2.CvtColor(org, gray, ColorConversionCodes.BGR2GRAY)
위에 설명했듯 이진화를 위해서는 일단 그레이로 변환하는게 좋다. 컬러값을 이진화하면 중간중간 원치않은 픽셀로 인해서 아주 지저분한 결과가 나오게 된다. 궁금하면 그레이를 빼고 직접 해보시면 되겠다.
Line 3 : Cv2.Threshold(gray, dst, 150, 255, ThresholdTypes.Binary)
이진화 함수이다. 이 예제에서는 임계값을 150으로 설정해서 임계값을 초과할 경우 최대값인 255로, 아닐경우 0으로 픽셀값을 이진화한다. 타입은 ThresholdTypes.Binary인데 이것도 여러가지 타입이 있으니 아래 나열해보자.
ThresholdTypes.Binary - 임계값을 초과할 경우 최대값, 아닐 경우 0
ThresholdTypes.BinaryInv - 임계값을 초과할 경우 0, 아닐 경우 최대값
ThresholdTypes.Trunc - 임계값을 초과할 경우 임계값, 아닐 경우 변형 없음
ThresholdTypes.Tozero - 임계값을 초과할 경우 변형 없음, 아닐 경우 0
ThresholdTypes.TozeroInv - 임계값을 초과할 경우 0, 아닐 경우 변형 없음
ThresholdTypes.Mask - 검은색 이미지로 변경(마스크용)
ThresholdTypes.Otsu - 오츠 알고리즘 적용(단일 채널 이미지에만 적용 가능)
ThresholdTypes.Triangle - 삼각형(Triangle) 알고리즘 적용(단일 채널 이미지에만 적용 가능)
사실 이미지 이진화는 일반적인 상황에서는 사용할 일이 없어서 저도 특별히 필요성을 못느끼기는 하지만 상황이 발생했을때 사용은 할줄 알아야겠죠.
반응형