회원 로그인
정보기억 정보기억에 체크할 경우 다음접속시 아이디와 패스워드를 입력하지 않으셔도 됩니다.
그러나, 개인PC가 아닐 경우 타인이 로그인할 수 있습니다.
PC를 여러사람이 사용하는 공공장소에서는 체크하지 마세요.
소셜네트워크 서비스를 통해서 로그인하시면 별도의 로그인 절차없이 회원서비스를 이용하실 수 있습니다.


최근 게시물

1.OAK 국가리포지터리

2.인코드 / 디코드 - 2..

2.인코드 / 디코드 - 2..

: 마야 2022, 파이썬 v3.7....

2022.03.08//read more

3.float is / fl..

3.float is / fl..

val
is_float(val)
...

2022.03.02//read more

4.ui 없이 mayapy로..

4.ui 없이 mayapy로..

목적마야를 실행하지 않고 오토리깅 하...

2022.02.17//read more

5.mayapy로 ui파일 ..

5.mayapy로 ui파일 ..

마야2018 테스트

mayapy...

2022.02.15//read more


안정적인 DNS 서비스 DNSEver
DNS Powered by DNSEver.com


OpenCV 10-3. 이미지 Thresholding - Otsu's Binarization

푸딩뱃살 | 2020.06.05 14:01 | 조회 125
https://blog.naver.com/samsjang OpenCV의 강좌를
공부 차원에서 재정리한 것입니다.

Otsu's Binarization
014-1, 014-2에서 정해진 임의값을 사용하였는데, 이런 문턱값을 어떻게 얻을 수 있나?(시행 착오?)

만약 이미지 히스토그램이 두개의 봉우리를 가지는 bimodal 이미지라고 하면,
이 이미지에 대한 문턱값으로 두 봉우리 사이의 값을 취하면 가장 좋은 결과를 얻게 된다.
  • Otsu Binarization은 이미지 히스토그램을 분석한 후 중간값을 취하여 thresholding 한다.
  • Thresholding과 blur 필터를 활용하면 이미지 노이즈 제거에 효율적으로 적용할 수 있다.

이미지 경로가 상대 경로이면 아래와 같이 오류 - 절대 경로로 변경하면 없어지지만 다른 오류(두번째 오류) Traceback (most recent call last):
File "소스 경로/opencv_014-3.py", line 71, in thresholding()
File "소스 경로/opencv_014-3.py", line 59, in thresholding plt.subplot(3, 3, i*3+1), plt.imshow(images[i*3], 'gray')
File "파이썬 경로\lib\site-packages\matplotlib\pyplot.py", line 2683, in imshow None else {}), **kwargs)
File "파이썬 경로\lib\site-packages\matplotlib\__init__.py", line 1601, in inner return func(ax, *map(sanitize_sequence, args), **kwargs)
File "파이썬 경로\lib\site-packages\matplotlib\cbook\deprecation.py", line 369, in wrapper
return func(*args, **kwargs)
File "파이썬 경로\lib\site-packages\matplotlib\cbook\deprecation.py", line 369, in wrapper
return func(*args, **kwargs)
File "파이썬 경로\lib\site-packages\matplotlib\axes\_axes.py", line 5671, in imshow im.set_data(X)
File "파이썬 경로\lib\site-packages\matplotlib\image.py", line 690, in set_data .format(self._A.shape))
TypeError: Invalid shape () for image data

위 오류 해결하면 아래 오류 - 이미지가 단일 채널이 아닌 다중 채널이여서?
파이썬 경로/python.exe 소스 경로/opencv_014-3.py
Traceback (most recent call last):
File "소스 경로/opencv_014-3.py", line 61, in thresholding()
File "소스 경로/opencv_014-3.py", line 37, in thresholding ret, thr2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.error: OpenCV(3.4.2) C:/Miniconda3/conda-bld/opencv-suite_1534379934306/work/modules/imgproc/src/thresh.cpp:1406: error: (-215:Assertion failed) src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) in function 'cv::threshold'

https://stackoverflow.com/questions/50631195/getting-an-error-opencv3-4-1-c-projects-opencv-python-opencv-modules-imgproc/50639075



# -*- coding: utf-8 -*-
# opencv_014-3.py
# https://blog.naver.com/samsjang/220504782549
# 이미지 Thresholding

import numpy as np
import cv2
import matplotlib.pyplot as plt

def thresholding():
    img = cv2.imread('images/image-14-3.jpg') #, cv2.IMREAD_GRAYSCALE)
    #img = cv2.imread('D:/_cloud/owncloud/rnd/programming/python/opencv/images/image-14-3.jpg')

    # 채널 확인
    # image-14-3.jpg는 (398, 398, 3) 출력으로, (height, width, 3) 단일 채널이 아니다.
    print('befor : ', img.shape)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)     # BGR을 gray로 변환
    print('after : ', img.shape)
    # 이미지 유형이 플로팅되지 않는지 확인, 출력은 uint8
    print('befor : ', img.dtype)
    img = img.astype('uint8')   # 플로팅
    print('after : ', img.dtype)
    #img = np.asarray(img, dtype=np.uint8)


    """
    if img.empty():
        print('image was not read!')
        return
    """

    # 전역 thresholding 적용
    ret, thr1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
    # Otsu 바이너리제이션
    # Otsu Binarization을 적용하는 함수는 없고, cv2.threshold() 함수에 cv2.THRESH_OTSU 플래그 값을
    # thresholding 플래그에 더하고 문턱값으로 0을 전달해주면 된다.
    # 이렇게 하면 cv2.threshold() 함수는 적절한 문턱값을 계산 후 이를 적용한 결과를 리턴한다.
    ret, thr2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    # 위 코드가 오류 시 여러 플래그를 결합하여 사용할 때 + 보단 | 사용

    # 가우시안 블러 적용 후 Otsu 바이너리제이션
    blur = cv2.GaussianBlur(img, (5, 5), 0)
    ret, thr3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

    titles = ['Original noisy', 'Histogram', 'G-Thresholding', 'Original noisy', 'Histogram', 'Otsu Thresholding', 'Gaussian-filtered', 'Histogram', 'Otsu Thresholding']

    images = [img, 0, thr1, img, 0, thr2, blur, 0, thr3]

    for i in range(3):
        # 결과를 출력하기 위해 matplotlib 사용
        plt.subplot(3, 3, i*3+1), plt.imshow(images[i*3], 'gray')
        plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])

        # ravel() https://rfriend.tistory.com/349
        plt.subplot(3, 3, i*3+2), plt.hist(images[i*3].ravel(), 256)
        plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])

        plt.subplot(3, 3, i*3+3), plt.imshow(images[i*3+2], 'gray')
        plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])

    plt.show()

thresholding()

결과의 히스토그램 이미지를 보면, Gaussian blur를 적용하면, 확실한 봉우리를 만들고, 여기에 Otsu 알고리즘을 적용하여 문턱값을 구한 후 thresholding을 적용하면, 보다 나은 노이즈 제거된 것을 알 수 있다.

281개(1/15페이지)
프로그래밍
번호 제목 글쓴이 조회 날짜
281 [Python] float is / float not is 푸딩뱃살 169 2022.03.02 15:03
280 [Python] 이터널 문자열 f 푸딩뱃살 161 2022.01.27 16:35
279 [Python] is와 ==의 차이 푸딩뱃살 96 2021.11.25 15:54
278 [Python] Error: ImportError: file line 1: Ba 푸딩뱃살 177 2021.11.16 11:24
277 [Python] 파이썬 디컴파일 - uncompyle6 첨부파일 푸딩뱃살 131 2021.11.10 14:46
276 [Python] 파이썬 확장자 설명 푸딩뱃살 113 2021.11.03 14:38
275 [참고] 웹 fbx 뷰어 푸딩뱃살 61 2021.10.19 15:46
274 [Python] enumerate() 푸딩뱃살 113 2021.10.13 14:44
273 [Python] 아나콘다에서 가상 환경 첨부파일 푸딩뱃살 147 2020.11.21 00:26
272 [Python] pip로 설치 때 퍼미션 에러 사진 첨부파일 푸딩뱃살 712 2020.06.06 17:13
>> [Python] OpenCV 10-3. 이미지 Thresholding - Otsu's Binarizatio 사진 푸딩뱃살 126 2020.06.05 14:01
270 [Python] OpenCV 10-2. 이미지 Thresholding - Adaptive Threshold 사진 푸딩뱃살 129 2020.06.05 13:58
269 [Python] OpenCV 10-1. 이미지 Thresholding 사진 푸딩뱃살 110 2020.06.05 13:56
268 [Python] OpenCV 9-2. 색 추적 푸딩뱃살 138 2020.06.02 23:29
267 [Python] OpenCV 9-1. 색공간 바꾸기 푸딩뱃살 110 2020.06.02 23:27
266 [Python] OpenCV 8-3. 이미지 비트 연산 사진 푸딩뱃살 101 2020.06.02 23:21
265 [Python] OpenCV 8-2. 이미지 블렌딩 (Image Blending) 사진 첨부파일 푸딩뱃살 115 2020.06.02 23:15
264 [Python] OpenCV 8-1. 이미지 연산 처리를 이용한 이미지 합성 사진 푸딩뱃살 103 2020.06.02 23:06
263 [Python] OpenCV 7-5. 이미지를 b/g/r 채널로 분할하기 푸딩뱃살 101 2020.05.17 18:23
262 [Python] OpenCV 7-4. 이미지 채널을 분할하고, 합치기 푸딩뱃살 104 2020.05.17 18:16