cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.

cv2.threshold()를 사용한 Python의 OpenCV 임계값

개요

임계값은 이미지에서 기본 분할을 수행하고 픽셀이 0 or 1 (또는 255 정수를 사용하여 표현하는 경우).

일반적으로 임계값을 사용하여 이미지에서 간단한 배경-전경 분할을 수행할 수 있으며 각 픽셀에 대한 간단한 기술의 변형으로 요약됩니다.

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

이 필수 과정은 다음과 같이 알려져 있습니다. 이진 임계값. 이제 – 작업 반전(전환 > 로 서명하다 < 기호), 설정 pixel_value ~로 threshold 최대값/0(잘림이라고 함) 대신 pixel_value 위의 경우 자체 threshold 또는 아래에 있는 경우 threshold.

이 모든 것은 OpenCV에서 다음과 같이 편리하게 구현되었습니다.

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

… 각각. 이것들은 상당히 단순하고, 이미지의 맥락을 고려하지 않고, 어떤 모양이 일반적인지 등을 알고 있다는 점에서 상대적으로 "순진한" 방법입니다. 이러한 속성의 경우 훨씬 더 많은 계산 비용과 강력한 기법.

이제 "순진한" 방법으로도 – 일부 좋은 임계값을 찾기 위해 휴리스틱을 사용할 수 있으며 여기에는 Otsu 방법과 삼각형 방법이 포함됩니다.

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

참고 : OpenCV 임계값은 기본적인 기술이며 조명 변화와 그라디언트, 색상 이질성 등에 민감합니다. 분할하려는 개체의 색상 편차가 크지 않고 노이즈를 줄이기 위해 흐리게 처리한 후 비교적 깨끗한 사진에 적용하는 것이 가장 좋습니다.

단일 임계값으로 기본 임계값과 관련된 일부 문제를 극복하는 또 다른 방법은 다음을 사용하는 것입니다. 적응 임계값 전역이 아닌 이미지의 각 작은 영역에 임계값을 적용합니다.

OpenCV를 사용한 간단한 임계값 설정

OpenCV의 Python API에서 임계값은 다음을 통해 수행됩니다. cv2.threshold() 방법 – 이미지(정수로 표시되는 NumPy 배열), 임계값, 최대값 및 임계값 방법(어떻게 thresholdmaximum_value 사용):

img = cv2.imread('objects.jpg')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


blurred = cv2.GaussianBlur(img, (7, 7), 0)

ret, img_masked = cv2.threshold(blurred, 220, 255, cv2.THRESH_BINARY)

반환 코드는 적용된 임계값일 뿐입니다.

print(f"Threshold: {ret}") 

여기서 임계값은 220 그리고 우리는 사용했습니다 THRESH_BINARY 방법 – 위의 모든 픽셀 값 220 로 증가될 것입니다 255, 아래의 모든 픽셀 값 220 로 낮아질 것이다 0, 전경 개체를 덮는 "마스크"로 흑백 이미지를 만듭니다.

왜 220이야? 이미지가 어떻게 생겼는지 알면 선택할 수 있는 임계값에 대한 대략적인 추측을 할 수 있습니다. 실제로 수동 임계값을 설정하려는 경우는 거의 없으며 잠시 후 자동 임계값 선택에 대해 다룹니다.

결과를 플로팅하자! OpenCV 창은 약간 까다로울 수 있으므로 Matplotlib를 사용하여 원본 이미지, 흐린 이미지 및 결과를 플로팅합니다.

fig, ax = plt.subplots(1, 3, figsize=(12, 8))
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)

임계값 방법

앞서 언급했듯이 함수에서 임계값과 최대값을 사용할 수 있는 다양한 방법이 있습니다. 처음에 이진 임계값을 살펴보았습니다. 메서드 목록을 만들고 하나씩 적용하여 결과를 플로팅해 보겠습니다.

methods = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]
names = ['Binary Threshold', 'Inverse Binary Threshold', 'Truncated Threshold', 'To-Zero Threshold', 'Inverse To-Zero Threshold']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    blurred = cv2.GaussianBlur(img, (7, 7), 0)
    ret, img_masked = cv2.threshold(blurred, 220, 255, method)

    fig, ax = plt.subplots(1, 3, figsize=(12, 4))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(img)
    ax[1].imshow(blurred)
    ax[2].imshow(img_masked)
    plt.tight_layout()

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

THRESH_BINARYTHRESH_BINARY_INV 서로 역이고 다음 사이의 이미지를 이진화합니다. 0255, 배경과 전경에 각각 할당하거나 그 반대로 할당합니다.

THRESH_TRUNC 사이의 이미지를 이진화 threshold255.

THRESH_TOZEROTHRESH_TOZERO_INV 사이를 이진화하다 0 및 현재 픽셀 값(src(x, y)). 결과 이미지를 살펴보겠습니다.

cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.
cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.
cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.
cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.

이러한 방법은 충분히 직관적이지만 좋은 임계값을 어떻게 자동화할 수 있으며 "좋은 임계값" 값은 무엇을 의미합니까? 지금까지 대부분의 결과에는 표시와 얼룩이 있는 비이상적인 마스크가 있었습니다. 이것은 동전의 반사 표면의 차이로 인해 발생합니다. 융기선이 빛을 반사하는 방식의 차이로 인해 동전의 색상이 균일하지 않습니다.

우리는 더 나은 글로벌 임계값을 찾아 어느 정도 이 문제와 싸울 수 있습니다.

OpenCV를 사용한 자동/최적화 임계값

OpenCV는 Otsu의 방법과 Triangle 방법의 두 가지 효과적인 전역 임계값 검색 방법을 사용합니다.

Otsu의 방법은 작동 중이라고 가정합니다. 바이모달 이미지. 이중 모드 이미지는 색상 히스토그램이 두 개의 피크만 포함하는 이미지입니다(즉, 두 개의 고유한 픽셀 값만 있음). 피크가 각각 "background" 및 "forground"와 같은 클래스에 속한다는 점을 고려하면 이상적인 임계값은 바로 그 중간에 있습니다.

cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.
이미지 크레딧 : https://scipy-lectures.org/

가우시안 블러를 사용하여 일부 이미지를 더 이중 모드로 만들 수 있지만 전부는 아닙니다.

종종 더 나은 성능을 제공하는 대안적인 알고리즘은 삼각형 알고리즘으로, 그레이 레벨 히스토그램의 최대값과 최소값 사이의 거리를 계산하고 선을 그립니다. 해당 선이 히스토그램의 나머지 부분에서 최대한 멀리 떨어져 있는 지점이 임계값으로 선택됩니다.

cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.

둘 다 회색조 이미지를 가정하므로 다음을 통해 입력 이미지를 회색으로 변환해야 합니다. cv2.cvtColor():

img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask1 = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
ret, mask2 = cv2.threshold(blurred, 0, 255, cv2.THRESH_TRIANGLE)

masked = cv2.bitwise_and(img, img, mask=mask1)

두 가지 방법으로 이미지를 실행하고 결과를 시각화해 보겠습니다.

methods = [cv2.THRESH_OTSU, cv2.THRESH_TRIANGLE]
names = ['Otsu Method', 'Triangle Method']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (7, 7), 0)

    ret, img_masked = cv2.threshold(blurred, 0, 255, method)
    print(f"Threshold: {ret}")

    fig, ax = plt.subplots(1, 3, figsize=(12, 5))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax[1].imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
    ax[2].imshow(cv2.cvtColor(img_masked, cv2.COLOR_BGR2RGB))

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.
cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.

여기에서 삼각형 방법은 이미지가 이중 모드가 아니기 때문에 Otsu의 방법보다 성능이 뛰어납니다.

import numpy as np

img = cv2.imread('coins.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

histogram_gray, bin_edges_gray = np.histogram(gray, bins=256, range=(0, 255))
histogram_blurred, bin_edges_blurred = np.histogram(blurred, bins=256, range=(0, 255))

fig, ax = plt.subplots(1, 2, figsize=(12, 4))

ax[0].plot(bin_edges_gray[0:-1], histogram_gray)
ax[1].plot(bin_edges_blurred[0:-1], histogram_blurred)

cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.

그러나 삼각형 방식이 어떻게 이미지와 함께 작동하여 더 만족스러운 결과를 얻을 수 있었는지는 분명합니다.

OpenCV 임계값의 한계

OpenCV를 사용한 임계값 설정은 간단하고 쉽고 효율적입니다. 그러나 그것은 상당히 제한적입니다. 다채로운 요소, 균일하지 않은 배경 및 변화하는 조명 조건을 도입하자마자 개념으로서의 전역 임계값이 너무 엄격해집니다.

이미지는 일반적으로 단일 임계값으로 충분하기에는 너무 복잡하며 다음을 통해 부분적으로 해결할 수 있습니다. 적응 임계값, 단일 전역 임계값 대신 많은 로컬 임계값이 적용됩니다. 또한 제한적이지만 적응형 임계값은 전역 임계값보다 훨씬 유연합니다.

결론

최근 몇 년 동안 이진 분할(여기에서 수행한 것과 같은) 및 다중 레이블 분할(임의의 수의 클래스를 인코딩할 수 있음)이 훨씬 더 강력하고 유연한 딥 러닝 네트워크로 성공적으로 모델링되었습니다. 또한 글로벌 및 로컬 컨텍스트를 분할 중인 이미지로 인코딩할 수 있습니다. 단점은 교육을 위한 데이터와 시간 및 전문 지식이 필요하다는 것입니다.

즉석에서 간단한 임계값을 지정하려면 OpenCV를 사용할 수 있습니다. 정확한 프로덕션 수준 세분화를 위해 신경망을 사용하는 것이 좋습니다.

더 나아가기 – 컴퓨터 비전을 위한 실용적인 딥 러닝

당신의 호기심 많은 성격이 당신을 더 멀리 가고 싶게 만드나요? 다음을 확인하는 것이 좋습니다. 코스: “파이썬을 이용한 컴퓨터 비전을 위한 실용적인 딥러닝”.

cv2.threshold() PlatoBlockchain Data Intelligence를 사용한 Python의 OpenCV 임계값. 수직 검색. 일체 포함.

또 다른 컴퓨터 비전 과정?

우리는 MNIST 숫자나 MNIST 패션의 분류를 하지 않을 것입니다. 그들은 오래전에 자신의 역할을 다했습니다. 고급 블랙박스 아키텍처가 성능 부담을 짊어지게 하기 전에 너무 많은 학습 리소스가 기본 데이터 세트와 기본 아키텍처에 집중하고 있습니다.

우리는 집중하고 싶다 신비화, 실용적인 사항, 이해, 직관실제 프로젝트. 배우고 싶다 방법 당신은 변화를 만들 수 있습니다? 우리는 뇌가 이미지를 처리하는 방식부터 유방암에 대한 연구 수준의 딥 러닝 분류기를 작성하고 "환각"하는 딥 러닝 네트워크에 이르기까지, 실제 작업을 통해 원리와 이론을 가르치고, 컴퓨터 비전을 해결하기 위해 딥러닝을 적용하는 전문가가 되기 위한 노하우와 도구.

안에 무엇입니까?

  • 비전의 첫 번째 원칙과 컴퓨터가 "보는" 방법을 가르칠 수 있는 방법
  • 컴퓨터 비전의 다양한 작업 및 응용
  • 작업을 더 쉽게 만들어줄 무역 도구
  • 컴퓨터 비전용 데이터세트 찾기, 생성 및 활용
  • 컨볼루션 신경망의 이론과 응용
  • 데이터 세트의 도메인 이동, 동시 발생 및 기타 편향 처리
  • Transfer Learning 및 다른 사람의 교육 시간 및 계산 리소스를 귀하의 이익을 위해 활용
  • 최첨단 유방암 분류기 구축 및 교육
  • 주류 아이디어에 건강한 회의론을 적용하고 널리 채택된 기술의 의미를 이해하는 방법
  • t-SNE 및 PCA를 사용하여 ConvNet의 "개념 공간" 시각화
  • 기업이 더 나은 결과를 얻기 위해 컴퓨터 비전 기술을 사용하는 방법에 대한 사례 연구
  • 적절한 모델 평가, 잠재 공간 시각화 및 모델의 관심 식별
  • 도메인 연구 수행, 자체 데이터 세트 처리 및 모델 테스트 설정
  • 최첨단 아키텍처, 아이디어의 진행, 독창적인 요소 및 구현 방법
  • KerasCV – 최첨단 파이프라인 및 모델 생성을 위한 WIP 라이브러리
  • 논문을 구문 분석하고 읽고 직접 구현하는 방법
  • 용도에 따른 모델 선택
  • 엔드 투 엔드 머신 러닝 파이프라인 만들기
  • Faster R-CNN, RetinaNets, SSD 및 YOLO를 통한 물체 감지에 대한 풍경 및 직관
  • 인스턴스 및 시맨틱 분할
  • YOLOv5를 사용한 실시간 객체 인식
  • YOLOv5 객체 감지기 훈련
  • KerasNLP(업계 최강의 WIP 라이브러리)를 사용하여 Transformers 작업
  • Transformer를 ConvNet과 통합하여 이미지 캡션 생성
  • Deepdream
  • 컴퓨터 비전을 위한 딥 러닝 모델 최적화

타임 스탬프 :

더보기 스택카부스