python 에서 hsv 색상 공간 을 계량 화 합 니 다.
작업 수요 로 인해 색채 직사 도 를 계산 하여 색채 특징 을 추출 해 야 하지만 색채 공간 을 계량 화하 지 않 으 면 직사 도 벡터 의 차원 이 너무 높 아 사용 하기 어렵다.그러나 opencv API 를 본 후에 관련 함 수 를 제공 하여 색상 직사 도 를 계산 하 는 동시에 계량 화 할 수 있 는 것 을 발견 하지 못 했 기 때문에 이 부분 기능 은 스스로 실현 할 수 밖 에 없다.다음은 두 부분 으로 나 누 어 소개 한다.
1.색상 공간 계량 화 표
RGB 모델 이 직관 적 이지 않 고 인간 시각 습관 에 맞지 않 기 때문에 색상 특징 추출 을 하기 전에 사진 을 RGB 색상 모델 에서 인간 시각 에 더 부합 하 는 HSV 모델 로 전환 해 야 한다.색상 특징 을 추출 할 때 가장 많이 사용 하 는 방법 중 하 나 는 색상 직사 도 법 이지 만 한 장의 그림 에 나타 난 색상 이 보통 매우 많아 직사 도 벡터 의 차원 이 비교적 높 기 때문에 HSV 공간 을 계량 화해 야 한다.사람들의 눈 이 색채 에 대한 감지 특성 에 따라 비교적 자주 사용 하 는 계량 화 방법 을 사용한다.즉,다음 과 같은 대응 관계 에 따라 계량 화 를 한다.
상기 계량 화 표를 바탕 으로 각 색채 의 분량 을 다음 과 같은 공식 에 따라 72 차원 1 차원 벡터 로 합성 한다
2.양 적 코드
코드 는 순수 python 을 사용 하여 효율 이 낮 고 388*500 픽 셀 의 사진 을 처리 하 는 데 1.45 초 걸 립 니 다.quantilize 함수 에 서 는 if-else 판단 문 구 를 사용 하지 않 아 최소 1/3 의 시간 을 절약 했다.그러나 이 속 도 는 만 족 스 럽 지 못 하 다.C++로 효율 이 더 높 을 것 이다.더 좋 은 생각 이 있 는 사람 이 있다 면 아래 에서 댓 글 을 주 고 받 는 것 을 환영 합 니 다.
#-*-coding:utf-8-*-
import cv2
import numpy as np
from datetime import datetime
from matplotlib import pyplot as plt
def colors(imagepath):
img = cv2.imread(imagepath)
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
nhsv = np.zeros(hsv.shape[:2], dtype=np.uint8)
t2 = datetime.now()
for i in range(hsv.shape[0]):
for j in range(hsv.shape[1]):
nhsv[i][j] = quantilize(hsv[i][j])
print datetime.now() - t2
hist = cv2.calcHist([nhsv], [0], None, [72], [0,71]) # 40x faster than np.histogramfaster than np.histogram
plt.plot(hist,color = 'r')
plt.xlim([0, 72])
plt.show()
def quantilize(value):
'''hsv
value : [21, 144, 23] h, s, v
opencv ,h-[0,180], s-[0,255], v-[0,255]
'''
#
value[0] = value[0] * 2
hlist = [20, 40, 75, 155, 190, 270, 290, 316, 360]
svlist = [21, 178, 255]
for i in range(len(hlist)):
if value[0] <= hlist[i]:
h = i % 8
break
for i in range(len(svlist)):
if value[1] <= svlist[i]:
s = i
break
for i in range(len(svlist)):
if value[2] <= svlist[i]:
v = i
break
return 9 * h + 3 * s + v
이상 비판 교 류 를 환영 합 니 다~업데이트
#-*-coding:utf-8-*-
import cv2
import numpy as np
from datetime import datetime
from matplotlib import pyplot as plt
hlist = [20, 40, 75, 155, 190, 270, 290, 316, 360]
svlist = [21, 178, 255]
def quantilize(h, s, v):
'''hsv '''
# value : [21, 144, 23] h, s, v
h = h * 2
for i in range(len(hlist)):
if h <= hlist[i]:
h = i % 8
break
for i in range(len(svlist)):
if s <= svlist[i]:
s = i
break
for i in range(len(svlist)):
if v <= svlist[i]:
v = i
break
return 9 * h + 3 * s + v
quantilize_ufunc = np.frompyfunc(quantilize, 3, 1) # ufunc , quantilize ufunc , 3 , 1 。
def colors(img):
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
nhsv = quantilize_ufunc(hsv[:,:,0], hsv[:,:,1], hsv[:,:,2]).astype(np.uint8) # frompyfunc ,
hist = cv2.calcHist([nhsv], [0], None, [72], [0,71]) # 40x faster than np.histogram
hist = hist.reshape(1, hist.shape[0]).astype(np.int32).tolist()[0]
return hist
if __name__ == '__main__':
img_path = path + 'test.jpg'
img = cv2.imread(img_path)
colors(img)
결실[0, 11, 31490, 100, 3, 32685, 0, 28, 313, 0, 0, 3268, 31, 0, 558364, 6, 1, 441, 0, 0, 2301, 92, 0, 34056, 0, 1, 396, 0, 0, 2682, 84, 5, 712, 0, 137, 55, 0, 0, 1215, 20, 2, 224, 0, 3, 0, 0, 0, 13838, 56, 0, 23474, 63, 23, 1, 0, 0, 4764, 0, 0, 2335, 0, 25, 27, 0, 0, 2302, 5, 0, 1676, 1, 59, 389]
이상 의 python 에서 hsv 색상 공간 에 대해 양 적 작업 을 하 는 것 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.