문제

Numpy와 Pil을 사용하여 두 개의 이미지를 함께 추가하려고합니다. 내가 이것을 할 방법 MATLAB 다음과 같습니다.

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

나는 다음과 같은 것을 얻는다 :

대체 텍스트 http://www.deadlink.cc/matlab.jpg

합성 프로그램을 사용하고 이미지를 추가하면 MATLAB 결과가 옳은 것 같습니다.

파이썬에서 나는 다음과 같은 일을하려고합니다.

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() 그러나 그것은 알파가 필요합니다.

내가 찾고있는 것을 달성하는 가장 좋은 방법은 무엇입니까?

소스 이미지 (이미지가 제거됨) :

대체 텍스트 http://www.deadlink.cc/_1.jpg 대체 텍스트 http://www.deadlink.cc/_2.jpg

Humm, Ok, 글쎄, 나는 이미지 추가 아이콘을 사용하여 소스 이미지를 추가하고 게시물을 편집 할 때 나타나지만 어떤 이유로 이미지가 게시물에 나타나지 않습니다.

(이미지가 제거되었습니다) 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 NOTE: Matlab 에서이 문제를 보지 못하는 이유는 아마도 Matlab이 그 기능 중 하나에서 암시 적으로 오버플로를 처리하기 때문일 것입니다.

다른 팁

알파 값이 0.5 인 Pil의 블렌드 ()를 사용하면 (IM1ARR + IM2ARR)/2와 동일합니다. 블렌드는 이미지에 알파 층이 있어야합니다.

이 시도:

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 to Pil 전환이 어떻게 작동하는지 정확히 기억할 수는 없지만 두 가지 사례가 있습니다. 나는 95%가 1이라고 확신하지만 내가 틀린 경우에만 2를주고 있습니다. 1) 1 IM1ARR은 MXN 정수 (ARGB)이며 IM1ARR 및 IM2ARR을 함께 추가하면 구성 요소 B1+B2> 255 인 경우 한 채널에서 다음 채널로 넘쳐납니다. Matlab이 이미지를 MXNX3 배열로 표현하여 각 컬러 채널이 별도로 표시됩니다. PIL 이미지 채널을 분할 한 다음 Numpy Arrays를 만들어이를 해결할 수 있습니다.

2) 1 IM1ARR은 MXNX3 바이트 배열이며 IM1ARR 및 IM2ARR을 함께 추가하면 구성 요소를 감싸고 있습니다.

또한 표시하기 전에 범위를 0-255 사이로 재생해야합니다. 선택은 2로, 스케일을 255/array.max ()로 나누거나 클립을 수행합니다. Matlab이 무엇을하는지 모르겠습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top