2017-03-18 10 views
-2

私はJPEG形式で大量のヒートマップ写真を持っています。それぞれの色に基づいて5つの異なるカテゴリに変換したいと思います3つの2次元配列が得られます(セクションAには1つ、セクションBには1つ、セクションCには1つ)。JPEG形式のヒートマップイメージをPythonのカテゴリに変換する

次のようなカテゴリがあります:

レッド:5、 ダークブラウン:4、 ライトブラウン:3、 ライトオレンジ:2、 ホワイト:1

あなたはトリミングされた写真を見ることができますそれは、次の画像ではJPEG形式でのみいくつかのトップの行を示しています

Heatmap

がどのように私はPythonでこれを行うことができますか?

+0

スタックオーバーフローはコード作成サービスではありません。すでにお持ちのコードを投稿してください。 – jadsq

答えて

0

加工にはOpenCVをインストールして使用することをお勧めします。これは、動作するPythonライブラリも提供します。

ヒートマップについては、以下のように動作します。大量のヒートマップに合わせて修正する必要があります。

まず、画像を3つに、それぞれA,BおよびCの1つにトリミングします。次に、各カテゴリの色のピクセルを抽出し、最初に白に変換し、次にそれぞれを16 x 16グレースケール画像にサイズ変更します。次に、ゼロ以外の値を現在のカテゴリ値に変換し、これを配列に追加します。

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の値が得られないように、最小最大値を調整する必要があります。

関連する問題