2017-03-18 8 views
-2

나는 방대한 heatmap 사진을 JPEG 형식으로 가지고 있으며 각 항목의 색을 기반으로 5 가지 범주로 항목을 변환하고 싶습니다. 세 개의 2 차원 배열로 나뉩니다 (섹션 A에 하나, 섹션 B에 하나, 섹션 C에 하나). 다음과 같이 JPEG 형식의 히트 맵 이미지를 파이썬의 범주로 변환

범주

은 다음과 같습니다

레드 : 5, 다크 브라운 : 4, 라이트 브라운 : 3, 라이트 오렌지 : 2, 화이트 : 1

당신은 자른 사진을 볼 수 있습니다 그 다음 이미지의 JPEG 형식으로 몇 상단 행을 보여줍니다

Heatmap

은 어떻게 파이썬에서이 작업을 수행 할 수 있습니다?

+0

스택 오버플로는 코드 작성 서비스가 아니므로 이미 가지고있는 코드를 게시하여 도움을 받으십시오. – jadsq

답변

0

처리를 돕기 위해 OpenCV을 설치하여 사용하는 것이 좋습니다. 이것은 또한 사용할 파이썬 라이브러리를 제공합니다.

다음 히트 맵에 대해 다음과 같이 작동합니다. 방대한 heatmap에 맞게 수정해야합니다.

먼저 이미지를 3으로 자릅니다. 하나는 A, BC입니다. 다음으로 각 범주 색의 픽셀을 추출하고 먼저 흰색으로 변환 한 다음 각각을 16 x 16 그레이 스케일 이미지로 크기를 조정합니다. 다음으로 0이 아닌 값을 현재 범주 값으로 변환하고이를 배열에 추가합니다.

import numpy as np 
import cv2  


def parse_image(img): 

    # Start with all zeros in a 16x16 array 
    data = np.zeros((16, 16), dtype=int) 

    # List holding min and max BGR values for each category 

    categories = [ 
     (5, (0, 0, 250), (5, 5, 255)),    # Red 
     (4, (5, 60, 152), (12, 78, 160)),   # Dark brown 
     (3, (9, 105, 225), (18, 120, 240)),  # Light brown 
     (2, (220, 235, 250), (230, 245, 255)),  # Light orange 
     (1, (250, 250, 250), (255, 255, 255)),  # White 
     ] 

    for category, bgr_min, bgr_max in categories: 
     # Extract pixels in the required range and convert them to 255 
     mask = cv2.inRange(img, bgr_min, bgr_max) 
     image_cat = cv2.bitwise_or(img, np.full(img.shape, 255, dtype=np.uint8), mask=mask) 

     # Convert the image into greyscale 
     image_grey = cv2.cvtColor(image_cat, cv2.COLOR_BGR2GRAY) 

     # Resize the image to 16x16 
     values = cv2.resize(image_grey, (16, 16)) 

     # Convert non black values into the current category value 
     values[values > 0] = category 

     # Add the values to the data array 
     data = data + values 

    return data 


# Load the heatmap  
image_src = cv2.imread("heatmap.jpg") 
cv2.imshow("Source", image_src) 

# Crop into 3 sub images 

starty = 28 
cropx = 234 
cropy = 184 
images = [] 

for number, startx in enumerate([30, 303, 572], start=1): 
    images.append(image_src[starty:starty+cropy,startx:startx+cropx]) 

# Parse A, B and C  
abc = [parse_image(img) for img in images] 
print abc 

그래서 히트 맵에 대한 당신이 (하나의 배열로 재편 될 수있다) 다음과 같은 출력 얻을 것입니다 제공 : JPG 이미지 작업,

[array([[2, 2, 5, 3, 5, 3, 5, 4, 2, 5, 2, 2, 5, 2, 2, 2], 
     [2, 2, 2, 3, 2, 2, 4, 3, 2, 4, 2, 2, 5, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 2, 2, 5, 2, 2, 2], 
     [4, 3, 2, 5, 4, 2, 5, 5, 5, 5, 2, 2, 5, 2, 2, 2], 
     [2, 3, 2, 4, 2, 2, 5, 3, 3, 5, 2, 2, 5, 2, 2, 2], 
     [3, 4, 3, 5, 4, 2, 5, 5, 5, 5, 2, 2, 5, 2, 2, 2], 
     [4, 4, 5, 5, 4, 2, 5, 5, 5, 5, 2, 2, 5, 2, 2, 2], 
     [5, 5, 5, 5, 5, 3, 2, 2, 5, 2, 2, 2, 5, 3, 5, 5], 
     [3, 4, 5, 4, 5, 2, 5, 5, 5, 5, 2, 2, 5, 2, 3, 5], 
     [3, 3, 5, 5, 4, 2, 5, 5, 3, 5, 2, 2, 5, 2, 2, 3], 
     [4, 4, 5, 5, 5, 5, 2, 2, 5, 2, 2, 2, 5, 2, 2, 5], 
     [3, 2, 2, 2, 3, 2, 4, 5, 5, 3, 2, 2, 5, 2, 2, 5], 
     [1, 1, 2, 2, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 2], 
     [2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2], 
     [4, 3, 2, 5, 5, 2, 5, 5, 2, 5, 2, 2, 5, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2]]), array([[2, 3, 3, 3, 2, 2, 2, 2, 0, 3, 2, 3, 2, 2, 2, 3], 
     [2, 3, 2, 3, 2, 3, 3, 2, 0, 3, 2, 2, 2, 2, 2, 3], 
     [2, 2, 2, 3, 2, 2, 3, 2, 3, 2, 2, 3, 2, 2, 2, 2], 
     [2, 2, 2, 3, 2, 2, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2], 
     [2, 3, 2, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 0, 3], 
     [2, 2, 2, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 3, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [3, 3, 4, 3, 2, 2, 3, 2, 2, 2, 3, 2, 2, 2, 2, 3], 
     [3, 3, 4, 3, 0, 3, 3, 2, 2, 2, 2, 3, 2, 2, 2, 3], 
     [2, 0, 3, 3, 0, 2, 3, 2, 0, 2, 3, 3, 2, 2, 2, 2], 
     [2, 3, 2, 3, 3, 2, 3, 2, 0, 2, 3, 3, 2, 2, 2, 2], 
     [1, 1, 2, 1, 0, 2, 1, 1, 3, 1, 2, 2, 1, 2, 2, 0], 
     [2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [3, 2, 2, 3, 2, 2, 3, 2, 3, 3, 2, 2, 2, 2, 2, 3], 
     [2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2]]), array([[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 0, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2], 
     [2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5], 
     [2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2], 
     [1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 3, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2]])] 

참고 이미지의 유물이있을 것을 의미합니다 따라서 색상은 정확한 값을 갖지 않습니다. 이것이 최소값과 최대 값이있는 이유입니다. 또한 일반적으로 RGB 값이 표시됩니다. 하지만 여기서는 BGR 값으로 작업하게됩니다. 0 값을 가지지 않도록 최소 최대 값을 조정해야합니다.