簡體   English   中英

NumPy,PIL添加圖像

[英]NumPy, PIL adding an image

我正在嘗試使用NumPy和PIL將兩個圖像組合在一起。 我在MATLAB中這樣做的方式如下:

>> M1 = imread('_1.jpg');
>> M2 = imread('_2.jpg');
>> resM = M1 + M2;
>> imwrite(resM, 'res.jpg');

我得到這樣的東西:

alt text http://www.deadlink.cc/matlab.jpg

使用合成程序並添加圖像,MATLAB結果似乎是正確的。

在Python中我試圖做同樣的事情:

from PIL import Image
from numpy import *

im1 = Image.open('/Users/rem7/Desktop/_1.jpg')
im2 = Image.open('/Users/rem7/Desktop/_2.jpg')

im1arr = asarray(im1)
im2arr = asarray(im2)

addition = im1arr + im2arr

resultImage = Image.fromarray(addition)
resultImage.save('/Users/rem7/Desktop/a.jpg')

我得到這樣的東西:

alt text http://www.deadlink.cc/python.jpg

為什么我會得到所有那些時髦的顏色? 我也嘗試使用ImageMath.eval("a+b", a=im1, b=im2) ,但是我得到一個關於RGB不支持的錯誤。

我還看到有一個Image.blend()但需要alpha。

什么是實現我正在尋找的最佳方式?

源圖像(圖像已被刪除):

alt text http://www.deadlink.cc/_1.jpg alt text http://www.deadlink.cc/_2.jpg

嗯,好吧,我使用添加圖片圖標添加了源圖像,當我正在編輯帖子時它們出現,但由於某種原因,圖像沒有顯示在帖子中。

(圖片已被刪除)2013 05 09

正如大家所說的那樣,你所觀察到的怪異顏色是溢出的。 正如你在schnaader的回答評論中指出的那樣,如果你添加這樣的圖像,你仍然會溢出

addition=(im1arr+im2arr)/2

這種溢出的原因是你的NumPy數組( im1arr im2arr )屬於uint8類型(即8位)。 這意味着數組的每個元素只能保存最多255個值,所以當你的總和超過255時,它會回到0:

>>>array([255,10,100],dtype='uint8') +  array([1,10,160],dtype='uint8')
array([ 0, 20,  4], dtype=uint8)

為避免溢出,您的數組應該能夠包含超過255的值。例如,您需要將它們轉換為浮點數 ,執行混合操作並將結果轉換回uint8

im1arrF = im1arr.astype('float')
im2arrF = im2arr.astype('float')
additionF = (im1arrF+im2arrF)/2
addition = additionF.astype('uint8')

不應該這樣做:

addition = im1arr/2 + im2arr/2

當您丟失信息時,通過在執行混合信息之前壓縮圖像的動態(有效地使圖像為7位)。

MATLAB注意 :你在MATLAB中沒有看到這個問題的原因可能是因為MATLAB在其中一個函數中隱含地處理溢出。

使用PIL的blend(),其alpha值為0.5,相當於(im1arr + im2arr)/ 2。 Blend不要求圖像具有alpha圖層。

嘗試這個:

from PIL import Image
im1 = Image.open('/Users/rem7/Desktop/_1.jpg')
im2 = Image.open('/Users/rem7/Desktop/_2.jpg')
Image.blend(im1,im2,0.5).save('/Users/rem7/Desktop/a.jpg')

您發布的代碼似乎只是總結了值,大於256的值溢出。 你想要“(a + b)/ 2”或“min(a + b,256)”之類的東西。 后者似乎是你的Matlab示例的方式。

要鉗制numpy數組值:

>>> c = a + b
>>> c[c > 256] = 256

你的樣本圖像沒有出現在我身上,所以我要做一些猜測。

我不記得numpy到pil轉換是如何工作的,但有兩種可能的情況。 我95%肯定它是1但是我給2以防萬一我錯了。 1)1 im1Arr是一個MxN整數數組(ARGB),當你將im1arr和im2arr加在一起時,如果組件b1 + b2> 255,則會從一個通道溢出到下一個通道。 我猜測matlab將它們的圖像表示為MxNx3陣列,因此每個顏色通道都是獨立的。 您可以通過拆分PIL圖像通道然后制作numpy數組來解決此問題

2)1 im1Arr是一個MxNx3字節數組,當你將im1arr和im2arr一起添加時,你將組件包裹起來。

在顯示之前,您還必須將范圍重新縮放到0-255之間。 您的選擇除以2,縮放255 / array.max()或做一個剪輯。 我不知道matlab是做什么的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM