2012-02-21 4 views
2

이미지를 특정 크기로 왜곡하지 않고 크기를 조정하고 필요할 때 패딩을 적용하는 코드 조각을 matlab에 작성했습니다.Matlab의 투명한 픽셀이있는 패드 배열

그러나 패딩은 검정색이며 투명하게 보이기를 바랍니다. 나는 이것을 어떻게하는지 모른다. 이것은 내가 가지고있는 코드입니다

% global variables 
inputFolder = 'input/images/'; 
outputFolder = 'input/resized/'; 
extension = 'jpg'; 
x = 1000; 
y = 1000; 

% list all the files in the input folder 
fileList = dir([inputFolder '*.' extension]); 

% loop through all the files in the input folder, resize, pad and save 
for i=1:length(fileList) 
    % get filename and load image 
    fname = fileList(i).name; 
    container = imread([inputFolder fname]); 

    % calculate local variables 
    containerY = size(container,1); 
    containerX = size(container,2); 
    containerProp = containerX/containerY; 
    canvasProp = x/y; 

    % determine proportions, apply padding and resize 
    if containerProp < canvasProp 
     container = imresize(container, [y NaN]); 
     containerX = size(container,2); 
     container = padarray(container, [0 floor((x - containerX)/2)], 0, 'pre'); 
     containerX = size(container,2); 
     container = padarray(container, [0 (x - containerX)], 0, 'post'); 
    elseif containerProp == canvasProp 
     container = imresize(container, [y x]); 
    else 
     container = imresize(container, [NaN x]); 
     containerY = size(container,1); 
     container = padarray(container, [floor((y - containerY)/2) 0], 0, 'pre'); 
     containerY = size(container,1); 
     container = padarray(container, [(y - containerY) 0], 0, 'post'); 
    end 

    % save resized image 
    imwrite(container, [outputFolder fname]); 
end 

검은 색에서 투명으로 변경하는 방법을 아는 사람이 있습니까?

+0

죄송합니다, matlab 코드에 대한 코드 강조 표시는 실제로 작동하지 않습니다. –

+0

첫 번째 문제는 jpeg에 투명도 채널이 없다는 것입니다. – user1071136

+0

@ user1071136, 알아요.하지만 .png로 저장하려고합니다. 그래서 내가 추가하는 투명 픽셀이 저장됩니다. –

답변

6

투명도는 알파 채널을 사용하여 얻을 수 있습니다. 이미지는 픽셀로 구성되며 각 픽셀은 빨간색 값, 녹색 값, 파란색 값 및 투명도 (= 알파) 값으로 구성됩니다.

파일을 작성할 때 ImageR x C x 3 배열 어디 있는지,

imwrite(Image, 'filename.png', 'Alpha', AlphaMatrix) 

를 알파 채널을 지정할 수 있으며 AlphaMatrixR x C 행렬이다. (RC은 이미지 크기입니다. Image에는 RGB 값이 포함되어 있으며 AlphaMatrix에는 알파 값이 포함되어 있습니다.

충분한 설명 - 여기에 예제가 있습니다. jpg 파일이 필요합니다. 이렇게하면 png 파일에 그라디언트 투명도가 기록됩니다. 즉, 왼쪽에는 완전히 투명 한 이고 오른쪽에는 완전히 불투명합니다. 귀하의 경우에는

I = imread('a.jpg'); 

imwrite(I, 'a.png', 'Alpha', ... 
    repmat((1:size(I,2))/size(I,2), [size(I, 1) 1])); 

, 당신은 단지 값 1과 0 주 배열의 데이터 형과 투명 값으로 불투명 한 부분을 채울 수 있습니다 - 그것은 uint8 또는 uint16 경우, 모든 값을해야합니다 범위는 [0..255]입니다. double 인 경우 [0..1]이어야합니다. container = double(container); : 그렇게 할

한 가지 방법은 imresize

  1. 에, containerdouble에 변환입니다. NaN
  2. padarray : containerNaN를 갖는 목적지 padarray(container, [0 floor(...)], nan, 'pre');
  3. 0과 알파 채널을 채우기 달리 1

    alpha = uint8(ones(size(container))); 
    alpha(isnan(container)) = 0; 
    
  4. 수정 containeruint8하고 NaN S 포함되지하기 :

    container(isnan(container(:,:,1))) = 0; 
    container = uint8(container); 
    

(희망에 따라 누군가가 더 좋은 해결책을 제시 할 수 있습니다 ...)

+0

+1 'int'와'double' 인자로 표현했을 때 이미지 함수의 다른 동작을 모두 나열하려면 +1, * wut *? –

+0

답장을 보내 주셔서 감사합니다. –

+0

마지막 수정 4 점 고정 (그렇지 않으면 치수 불일치가 발생 함) – user1071136