2023. 1. 29. 09:00ㆍVB.NET/OpenCVSharp
이미지 윤곽선이란 각 이미지별 테두리 가장자리 라인을 구하는걸 뜻한다. 사람이 그림을 그릴때 처음으로 그리게 되는 대략적인 테두리를 의미한다고 보면 된다. 보통 이렇게 테두리를 따려고 할때는 그레이 이미지를 기준으로 한다. 이건 이전 강좌중 이진화때와 비슷한데 컬러이미지의 테두리를 바로 따게 되면 중간값들에서 원치 않는 결과가 나오기 때문에 일단 그레이로 변경 후 테두리를 따고 이 좌표를 이용해서 컬러이미지의 테두리를 구하게 된다.
이미지 윤곽선을 구하기 위해서는 현저하게 픽셀값이 변하는 지점을 찾아야 하는데 내부적으로 미분을 이용하고, 이에 따른 미분지수도 활용해야 한다. 일반적으로 너무 어렵기 때문에 이번 강좌에서는 종류와 결과만 알아보고 더 자세한 부분은 검색을 통해 알아보도록 하자.
메인폼에 버튼 추가 - Name : ButtonEdge, Text : Edge
버튼클릭 이벤트에 아래 소스를 추가해서 확인해보자.
Private Sub ButtonEdge_Click(sender As Object, e As EventArgs) Handles ButtonEdge.Click
Dim org As New Mat("D:\test\chipmunk.jpg", ImreadModes.Grayscale), dst As Mat
dst = org.Sobel(MatType.CV_8U, 1, 0, 3)
PictureBoxOrg.Image = org.ToBitmap : PictureBoxDst.Image = dst.ToBitmap
End Sub
프로젝트 실행후 Bitwise 버튼을 누르면 아래 화면과 같이 결과가 나와야 성공
Line 2 : dst = org.Sobel(MatType.CV_8U, 1, 0, 3)
Sobel 함수의 원형은 아래와 같다.
Public Mat Sobel(MatType ddepth, int xorder, int yorder, int ksize = 3, double scale = 1, double delta = 0, BorderTypes borderType = BorderTypes.Default)
1. ddepth : 출력 정밀도 - 출력 이미지의 정밀도를 MatType 형식으로 지정
2. xorder : X방향 미분 차수
3. yorder : Y방향 미분 차수
4. ksize : 커널 크기로 1~31 사이의 홀수값으로 지정
5. scale : 비율
6. delta : 오프셋
7. borderType : 가장자리 처리방식
내용이 상당히 어렵다. https://076923.github.io/posts/Python-opencv-14/ 여기에 보면 자세한 설명이 있는데 이 설명을 봐도 이해가 잘 안된다. 프로그래밍 지식 외에도 수학적인 지식이 많이 필요한 부분이다. 하지만 이런 미분차수같은 개념을 몰라도 사용이 가능하다. 이런 개념까지 다 알고 있으면 직접 함수를 만들어쓰지 라이브러리를 사용할 필요가 없지 싶다. 원하는 결과를 내기 위해 파라미터 숫자들을 바꿔가며 몇번 삽질 하다보면 답을 낼 수 있을것이다.
Laplacian 함수의 원형은 아래와 같다.
Public Mat Laplacian(MatType ddepth, int ksize = 1, double scale = 1, double delta = 0, BorderTypes borderType = BorderTypes.Default)
위 Sobel 함수에 사용되는 파라미터들이 다 있다. 서로 조금씩 다르다고 하는데 자세한 내용은 위 링크를 참고하자.
Canny 함수의 원형은 아래와 같다.
public Mat Canny(double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)
위 두가지 함수의 장점만 취한거라고 하는데 결과물을 비교하며 사용할 필요성이 있을듯 싶다.
이미지의 윤곽선을 구하게 되면 포토샵의 소위 누끼따는 기능의 구현이 가능하다. 물론 포토샵만큼의 결과를 얻으려면 수많은 시행착오와 좌절을 맛보겠지만 어느정도 흉내내는 정도는 며칠만 삽질해도 가능하지 않을까?
이제 슬슬 강좌가 중급단계로 넘어가고 있다. 이걸 일일이 원리를 설명하고 다양한 경우의 수에 대한 예제를 모두 해볼수는 없으니 어떤 함수가 있고, 이 함수를 사용하면 결과는 어떻게 되고, 세부값을 조정하는 방법은 어떤 방법이 있는지 정도로만 강좌를 해보도록 하자.
'VB.NET > OpenCVSharp' 카테고리의 다른 글
[VB.NET] 차근차근 OpenCVSharp 강좌 - 19. Convert Color (0) | 2023.01.31 |
---|---|
[VB.NET] 차근차근 OpenCVSharp 강좌 - 18. HSV (0) | 2023.01.30 |
[VB.NET] 차근차근 OpenCVSharp 강좌 - 16. 이미지 비트연산 (0) | 2023.01.28 |
[VB.NET] 차근차근 OpenCVSharp 강좌 - 15. 이미지 위에 도형 그리기 (0) | 2023.01.27 |
[VB.NET] 차근차근 OpenCVSharp 강좌 - 14. 이미지 위에 글씨 쓰기 (0) | 2023.01.26 |