Python+OpenCV 조명 하 이 라 이 트 를 측정 하 는 실현 방법

이 박문 은 이미지 에서 조명 하 이 라이트(이미지 에서 가장 하 이 라이트)를 찾 는 강 좌 를 공유 합 니 다.예 를 들 어 이미지 에서 다섯 개의 조명 하 이 라 이 트 를 검 측 하고 표시 합 니 다.프로젝트 효 과 는 다음 과 같 습 니 다.


첫 번 째 단계:원본 그림 을 가 져 오고 엽 니 다.코드 는 다음 과 같 습 니 다.

# import the necessary packages
from imutils import contours
from skimage import measure
import numpy as np
import argparse
import imutils
import cv2
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
 help="path to the image file")
args = vars(ap.parse_args())
두 번 째 단계:그림 에서 가장 밝 은 구역 을 검사 하기 시작 합 니 다.먼저 디스크 에서 그림 을 불 러 온 다음 에 그 레이스 케 일 로 전환 하고 부 드 러 운 필 터 를 해서 고주파 소음 을 줄 이 고 코드 는 다음 과 같 습 니 다.

#load the image, convert it to grayscale, and blur it
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (11, 11), 0)
불 이 켜 진 그림 을 가 져 옵 니 다.필터 후 효 과 는 다음 과 같 습 니 다.

세 번 째 단계:한도 값 화 처리,모호 한 그림 에서 가장 밝 은 영역 을 표시 하기 위해 픽 셀 값 p>=200,255(흰색),픽 셀 값<200,0(검은색)으로 설정 하고 코드 는 다음 과 같 습 니 다.

# threshold the image to reveal light regions in the
# blurred image
thresh = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY)[1]
효 과 는 다음 과 같다.

 4 단계:이때 이미지 에 소음(작은 반점)이 존재 하 는 것 을 볼 수 있 기 때문에 부식 과 팽창 작업 을 통 해 제거 해 야 합 니 다.코드 는 다음 과 같 습 니 다.

# perform a series of erosions and dilations to remove
# any small blobs of noise from the thresholded image
thresh = cv2.erode(thresh, None, iterations=2)
thresh = cv2.dilate(thresh, None, iterations=4)
이때'깨끗 하 다'는 그림 은 다음 과 같다.

STEP 5:본 프로젝트 의 관건 적 인 절 차 는 위의 그림 의 모든 구역 을 표시 하 는 것 입 니 다.부식 과 팽창 을 응용 한 후에 도 나머지 작은 블록 구역 을 걸 러 내 려 고 합 니 다.좋 은 방법 은 연결 구성 요소 분석 을 실행 하 는 것 입 니 다.코드 는 다음 과 같 습 니 다.

# perform a connected component analysis on the thresholded
# image, then initialize a mask to store only the "large"
# components
labels = measure.label(thresh, neighbors=8, background=0)
mask = np.zeros(thresh.shape, dtype="uint8")
# loop over the unique components
for label in np.unique(labels):
 # if this is the background label, ignore it
 if label == 0:
  continue
 # otherwise, construct the label mask and count the
 # number of pixels 
 labelMask = np.zeros(thresh.shape, dtype="uint8")
 labelMask[labels == label] = 255
 numPixels = cv2.countNonZero(labelMask)
 # if the number of pixels in the component is sufficiently
 # large, then add it to our mask of "large blobs"
 if numPixels > 300:
  mask = cv2.add(mask, labelMask)
상기 코드 에서 네 번 째 줄 은 scikit-image 라 이브 러 리 를 사용 하여 실제 연결 구성 요소 분석 을 수행 합 니 다.measure.lable 에서 돌아 오 는 label 과 한도 값 그림 은 같은 크기 를 가지 고 있 습 니 다.유일한 차이 점 은 label 에 저 장 된 한도 값 이미지 의 모든 반점 에 대응 하 는 정수 입 니 다.
그리고 다섯 번 째 줄 에서 큰 반점 을 저장 하기 위해 마스크 를 초기 화 합 니 다.
일곱 번 째 줄 은 모든 label 의 정수 탭 을 반복 하기 시작 합 니 다.탭 이 0 이면 배경 을 검사 하고 안전하게 무시 할 수 있 음 을 표시 합 니 다(9,10 줄).그렇지 않 으 면 현재 지역 에 마스크 를 구축 합 니 다.
모든 탭 의 labelMask 를 시각 적 으로 구축 한 GIF 애니메이션 을 제공 합 니 다.이 애니메이션 을 사용 하면 모든 구성 요소 에 접근 하고 표시 하 는 방법 을 알 수 있 습 니 다.

15 번 째 줄 은 labelMask 의 비 0 픽 셀 을 계산 합 니 다.numPixels 가 미리 정 의 된 한도 값(이 예 에서 총 300 픽 셀)을 초과 하면 이 반점 이'충분 하 다'고 생각 하고 마스크 에 추가 합 니 다.출력 마스크 는 다음 그림 과 같 습 니 다:

STEP 6:그림 의 모든 작은 반점 이 걸 러 지고 큰 반점 만 남 았 습 니 다.마지막 단 계 는 그림 에 표 시 된 반점 을 그립 니 다.코드 는 다음 과 같 습 니 다.

# find the contours in the mask, then sort them from left to
# right
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = contours.sort_contours(cnts)[0]
# loop over the contours
for (i, c) in enumerate(cnts):
 # draw the bright spot on the image
 (x, y, w, h) = cv2.boundingRect(c)
 ((cX, cY), radius) = cv2.minEnclosingCircle(c)
 cv2.circle(image, (int(cX), int(cY)), int(radius),
  (0, 0, 255), 3)
 cv2.putText(image, "#{}".format(i + 1), (x, y - 15),
  cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
# show the output image
cv2.imshow("Image", image)
cv2.waitKey(0)
 마지막 으로 프로그램 을 실행 하면 조명 하 이 라이트 의 검 측 과 표 시 를 실현 할 수 있 습 니 다.모든 전 구 는 독특한 동그라미 로 표시 되 어 있 고 원 은 모든 밝 은 구역 을 둘러싸 고 있 습 니 다.효 과 는 다음 과 같 습 니 다.


본문 은Detecting multiple bright spots in an image with Python and OpenCV
파 이 썬+OpenCV 에서 조명 하 이 라 이 트 를 감지 하 는 실현 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 OpenCV 에서 조명 하 이 라 이 트 를 감지 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기