2012-02-08 42 views
10

Tôi là người mới hoàn thành xử lý hình ảnh và tôi đoán điều này khá dễ thực hiện, nhưng tôi không biết thuật ngữ đó. Về cơ bản tôi có một hình ảnh đen trắng, tôi chỉ đơn giản là muốn phủ lên một lớp phủ màu cho hình ảnh, để tôi có hình ảnh được phủ xanh lục đọc và màu vàng giống như hình ảnh được hiển thị bên dưới (tôi thực sự có thể làm được) t hiển thị bởi vì tôi không có đủ danh tiếng để làm như vậy - grrrrrr). Hãy tưởng tượng tôi có một hình ảnh vật lý, và một lớp phủ màu xanh lá cây/đỏ/xanh/vàng, mà tôi đặt trên đầu trang của hình ảnh. Lý tưởng nhất là tôi muốn làm điều này bằng cách sử dụng Python PIL nhưng tôi sẽ rất vui khi làm điều đó bằng cách sử dụng ImageMagik, nhưng một trong hai cách tôi cần để có thể kịch bản quá trình như tôi có 100 hoặc hơn hình ảnh mà tôi cần để thực hiện quy trình.Áp dụng lớp phủ màu cho hình ảnh trong PIL hoặc Imagemagik

Trả lời

18

Dưới đây là đoạn mã cho biết cách sử dụng scikit-image để phủ màu trên hình ảnh cấp độ xám. Ý tưởng là chuyển đổi cả hai hình ảnh sang không gian màu HSV, và sau đó thay thế các giá trị màu sắc và độ bão hòa của hình ảnh cấp độ xám bằng hình ảnh của mặt nạ màu.

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() 

Dưới đây là kết quả:

enter image description here

+0

Cảm ơn Stefan, đó là rất hữu ích. – Ctrlspc

+1

Cảm ơn Stefan, tôi thường xuyên sử dụng nó. Làm thế nào điều này có thể được mở rộng vượt quá 3 màu sau một sơ đồ màu, ví dụ như plt.cm.cmap? Tôi có 7 bản đồ nhị phân, tôi cần phủ lên hình ảnh màu xám. – iratzhash

+0

plt.cm.viridis (hoặc bất kỳ màu nào) sẽ trả lại giá trị RGB cho bất kỳ cuộc gọi nào, ví dụ: "Trong [10]: plt.cm.viridis (15) Out [10]: (0.28192400000000001, 0.089665999999999996, 0.41241499999999998, 1.0)". Bạn cũng có thể hoạt động trên toàn bộ mảng, ví dụ: "plt.cm.viridis (my_image)" để lấy các giá trị RGB phù hợp. –

8

tôi đã kết thúc việc tìm kiếm một câu trả lời này sử dụng PIL, về cơ bản tạo ra một hình ảnh mới với một màu khối, và sau đó sắp xếp bố cục hình ảnh ban đầu, với điều này hình ảnh mới, sử dụng mặt nạ xác định lớp alpha trong suốt. Mã dưới đây (thích nghi để chuyển đổi tất cả các hình ảnh trong một thư mục có tên dữ liệu, xuất ra thành một thư mục có tên đầu ra):

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,)) 

Không thể gửi những hình ảnh đầu ra không may do thiếu đại diện.

+2

Cảm ơn và đây là một số đại diện cho bạn – LoveGandhi

1

Xem ý chính của tôi https://gist.github.com/Puriney/8f89b43d96ddcaf0f560150d2ff8297e

chức năng cốt lõi qua opencv được mô tả như dưới đây.

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) 

Thêm lớp phủ màu và trong suốt ở hai RGB hoặc hình ảnh màu xám có thể làm việc: highlight-on-color highlight-on-gray

Các vấn đề liên quan