Opencv

9-5 Opencv에 의한 세균 이미지 RGB HUE 색상 필터링 처리

coding art 2020. 6. 1. 22:39
728x90

보라색상이 강한 세균 이미지를 보라색 HUE 필터링 후 이로부터 Contour 명령을 사용하여 개개의 세균 이미지를 출력해보자. 아직은 수많은 종류의 세균을 대상으로 하는 imagenet 과 같은 오픈 소스 데이터 베이스가 없으므로 HUE 필터링과 같은 기법 사용이 필요해 보인다.

라즈베리 파이나 Jetson Nano 에서도 실행이 가능한 현재의 코드는 속도가 보다 빠른 윈도우즈 PC 의 아나콘다에서 실행하였다. 사용하는 프론트 엔드에서 imutils 가 설치되었늦지 주의해야 할 필요가 있다.

cv2.VideoCapture(0) 명령은 PC에 설치되어 있는 웹캠을 지정한다. 하지만 이 보라색 필터링 코드에서는 동영상 대신 cv2.imread 명령에 의해 현재의 코드와 동일한 폴더 내에 저장되어 있는 사진 이미지를 불러와 필터링 처리함에 유의하자.

보라색 HUE 필터의 범위를 잘 조정해야 적절한 보라색 마스크를 얻을 수 있다.

Contour를 찾아내기 위해서는 흑백 threshold 레벨 처리된 이미지를 준비해야 하나 여기서는 흑백 처리된 보라색 필터링 된 결과로 대체하였으며 별 문제 없이 코드가 실행되었다. cv2.CHAIN_APPROX_SIMPLE 은 찾은 Contour 의 시작점과 끝나는 점을 포함하는 최소한도 수의 좌표만 저장하지만 cv2.CHAIN_APPROX_NONE은 모든 좌표 값을 다 저장하게 된다.

virus.png

#contour_purple_detect.py

import time
import cv2
import sys
import numpy as np
import imutils

# initialize the camera and grab a reference to the raw camera capture
camera = cv2.VideoCapture(0)
time.sleep(0.1)

while True:


image = cv2.imread('virus.png')
#image = cv2.GaussianBlur(image,(11,11), cv2.BORDER_DEFAULT)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)


cv2.imshow("image", image)
#lower_purple = np.array([100,100,50])
lower_purple = np.array([110,125,150])
#upper_purple = np.array([180,255,240])
upper_purple = np.array([180,200,200])
maskpurple = cv2.inRange(hsv, lower_purple, upper_purple)
#respurple = cv2.bitwise_and(image,image, mask= maskpurple)

cv2.imshow('maskpurple', maskpurple)
#cv2.imshow('respurple',respurple)
#find contours (i.e., outlines) of the foreground objects in the
# thresholded image
cnts = cv2.findContours(maskpurple, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)
cnts = imutils.grab_contours(cnts)
output = image.copy()
# loop over the contours

for c in cnts:
cv2.drawContours(output, [c], -1, (240, 0, 159), 2)

cv2.imshow("Contours", output)
# show the frame
key = cv2.waitKey(1) & 0xFF
# clear the stream in preparation for the next frame

# if the `q` key was pressed, break from the loop
if key == ord("q"):
break

cv2.destroyAllWindows()