2012-02-08 3 views
10

私は画像処理の初心者ですが、これはかなり簡単ですが、わかりません。PILまたはImagemagikの画像にカラーオーバーレイを適用する

基本的に私は白黒のイメージを持っています。イメージに色のついたオーバーレイを適用したいので、以下のイメージのように青い緑色の読み取りと黄色でオーバーレイされたイメージを取得します(実際、私はそうするために十分な評判がないので、ショーをする - grrrrrr)。画像の上に物理的な画像と、緑色/赤色/青色/黄色のオーバーレイがあるとします。

私はこれをPython PILを使用してやってみたいと思っていますが、私はImageMagikを使ってもうれしく思いますが、どちらかの方法でスクリプトを作成する必要があります。プロセスを実行する。

答えて

18

scikit-imageを使用してグレーレベル画像の色をオーバーレイする方法を示すコードスニペットです。アイデアは、両方の画像をHSVカラースペースに変換し、グレーレベル画像の色相と彩度の値をカラーマスクの色相と彩度の値に置き換えることです。

from skimage import data, color, io, img_as_float 
import numpy as np 
import matplotlib.pyplot as plt 

alpha = 0.6 

img = img_as_float(data.camera()) 
rows, cols = img.shape 

# Construct a colour image to superimpose 
color_mask = np.zeros((rows, cols, 3)) 
color_mask[30:140, 30:140] = [1, 0, 0] # Red block 
color_mask[170:270, 40:120] = [0, 1, 0] # Green block 
color_mask[200:350, 200:350] = [0, 0, 1] # Blue block 

# Construct RGB version of grey-level image 
img_color = np.dstack((img, img, img)) 

# Convert the input image and color mask to Hue Saturation Value (HSV) 
# colorspace 
img_hsv = color.rgb2hsv(img_color) 
color_mask_hsv = color.rgb2hsv(color_mask) 

# Replace the hue and saturation of the original image 
# with that of the color mask 
img_hsv[..., 0] = color_mask_hsv[..., 0] 
img_hsv[..., 1] = color_mask_hsv[..., 1] * alpha 

img_masked = color.hsv2rgb(img_hsv) 

# Display the output 
f, (ax0, ax1, ax2) = plt.subplots(1, 3, 
            subplot_kw={'xticks': [], 'yticks': []}) 
ax0.imshow(img, cmap=plt.cm.gray) 
ax1.imshow(color_mask) 
ax2.imshow(img_masked) 
plt.show() 

ここでは出力です:

enter image description here

+0

おかげでステファンを、それは非常に有用でした。 – Ctrlspc

+1

ステファンありがとう、私は頻繁にこれを静かに使用します。これをどのようにして3つの色、すなわちplt.cm.cmapを超えて拡張することができますか? 私は7つのバイナリマップを持っています、私はグレースケールイメージにオーバーレイする必要があります。 – iratzhash

+0

plt.cm.viridis(またはいずれかの色)は、任意の呼び出しのRGB値を返します。 "[10]で:plt.cm.viridis(15) Out [10] :(0.28192400000000001,0.089665999999999996,0.41241499999999998,1.0)"。配列全体を操作することもできます。 "plt.cm.viridis(my_image)"をクリックして適切なRGB値を取得します。 –

8

私は基本的にブロック色で新しいイメージを作成し、次にこれを、元の画像を合成し、PILを使用して、この答えを見つけてしまいました透明なアルファレイヤを定義するマスクを使用して新しいイメージを作成します。以下のコード(出力というフォルダに出力し、データと呼ばれるフォルダ内のすべての画像を変換するようになって):

from PIL import Image 
import os 

dataFiles = os.listdir('data/') 

for filename in dataFiles: 

    #strip off the file extension 
    name = os.path.splitext(filename)[0] 

    bw = Image.open('data/%s' %(filename,)) 

    #create the coloured overlays 
    red = Image.new('RGB',bw.size,(255,0,0)) 
    green = Image.new('RGB',bw.size,(0,255,0)) 
    blue = Image.new('RGB',bw.size,(0,0,255)) 
    yellow = Image.new('RGB',bw.size,(255,255,0)) 

    #create a mask using RGBA to define an alpha channel to make the overlay transparent 
    mask = Image.new('RGBA',bw.size,(0,0,0,123)) 

    Image.composite(bw,red,mask).convert('RGB').save('output/%sr.bmp' % (name,)) 
    Image.composite(bw,green,mask).convert('RGB').save('output/%sg.bmp' % (name,)) 
    Image.composite(bw,blue,mask).convert('RGB').save('output/%sb.bmp' % (name,)) 
    Image.composite(bw,yellow,mask).convert('RGB').save('output/%sy.bmp' % (name,)) 

が原因担当者の不足のため、残念ながら出力画像を投稿することができません。

+2

ありがとうございます – LoveGandhi

1

opencvを経由して私の要旨https://gist.github.com/Puriney/8f89b43d96ddcaf0f560150d2ff8297e

コア機能を参照してくださいは、以下のように記述されています。

def mask_color_img(img, mask, color=[0, 255, 255], alpha=0.3): 
    ''' 
    img: cv2 image 
    mask: bool or np.where 
    color: BGR triplet [_, _, _]. Default: [0, 255, 255] is yellow. 
    alpha: float [0, 1]. 

    Ref: http://www.pyimagesearch.com/2016/03/07/transparent-overlays-with-opencv/ 
    ''' 
    out = img.copy() 
    img_layer = img.copy() 
    img_layer[mask] = color 
    out = cv2.addWeighted(img_layer, alpha, out, 1 - alpha, 0, out) 
    return(out) 

働くことができるRGBまたはグレー画像のいずれかに色と透明オーバーレイを追加します。 highlight-on-color highlight-on-gray

関連する問題