Numpy, 이미지를 추가하는 필
-
22-08-2019 - |
문제
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이 무엇을하는지 모르겠습니다