2017-05-06 7 views
0

이 코드는 (거의) 내가 원하는 것을 수행하지만 어떻게 그렇게 단순 할 수 있는지 이해하지 못합니다. 누군가가이 코드가 어떻게 작동하는지 설명해 주시겠습니까?이것은 무엇입니까 : uint8 ((double (weather1618) ./ maxv). * 50);

FIY, weather1618은 384x384 배열이며 범위는 -76에서 -30입니다. maxv 값은 -30입니다.

mapped_array = uint8((double(weather1618) ./ maxv) .* 50); 
image(mapped_array); 

왜. 50 *. * (100)은 서로 다른 이미지를 제공하지만 않는다. * 100. * 500. * 1000은 동일?

enter image description here

내가 직접 할 있었다면,

image(weather1618); 

나는 단지 파란색 이미지를 얻을 것입니다.

enter image description here

+0

'class (weather1618)'은 무엇을 반환합니까? – codeaviator

+1

라인이하고있는 일이'image' 데이터를 준비하고 있다면, imshow (weather1618, [])'또는'imagesc (weather1618)'로 바꿀 수 있습니다. –

+0

@codeaviator 'double' – katarado

답변

3

이 코드 (거의) 내가 원하는 것을하지만 난 그게 간단한 것을 할 수있는 방법을 이해하지 않습니다. 그래서 누군가가, 제발,이 코드 어떻게 작동 설명해 주시겠습니까?

이러한 종류의 질문은 일반적으로 not the best fit for Stack Overflow입니다. 그러나 이해하지 못하는 코드 줄을 좁혀 버렸기 때문에 설명해 드리겠습니다.

남대문, weather1618는 -76에서 -30의 범위와 384x384 배열 :

당신은 언급했다. maxv의 값은 -30입니다.

코드의 첫 번째 줄 :

mapped_array = uint8((double(weather1618) ./ maxv) .* 50); 

다음과 같은 기능/연산자를 호출합니다 : - 배정 밀도

  • ./ (운영자)로 변환 -

    • double (기능) 요소를 와이드 구분
    • .* (연산자) - Ele , 표준 현명한 곱셈
    • unit8 (기능) - 8 비트 부호없는 정수로 변환 무슨 일이야

    :

    1. double(weather1618)double-precision floating-point formatweather1618 매트릭스 변환, 그래서 행렬의 값은 이제 십진수. MATLAB에서 double은 양수 값의 경우 -1.79769e + 308 ~ -2.22507e-308 범위의 수를 나타낼 수 있고 양수 값의 경우에는 2.22507e-308 ~ 1.79769e + 308 범위의 숫자를 나타낼 수 있습니다 (source). 이 변환을 수행하는 가능한 이유는 이며, 단계 2 (0120-)에서을 피하십시오 (다음에 설명 됨).
    2. ./ maxv은 매트릭스의 모든 요소를 ​​-30으로 나눕니다. 이것은 행렬의 모든 요소의 부호를 반전시키고 1/30의 비율로 데이터의 크기를 조정합니다. 이전 단계에서 행렬이 double로 변환되었으므로 나눗셈 이후에 얻은 배열도 double 유형이되며 십진수가 포함됩니다.
    3. .* 50은 행렬의 모든 요소에 50을 곱합니다. 그러면 데이터의 계수가 50 배로 조정됩니다. 곱셈 후에 얻은 배열은 이전과 같이 double 유형으로 계속됩니다.
    4. uint8(...)
    5. 는 UINT8 입력 더블 형의 매트릭스 ( unsigned integer)를 변환하므로 매트릭스의 값은 현재 0 내지 255

    코드의 두 번째 행의 범위 일 것이다

    image(mapped_array); 
    

    image 함수를 호출하여 4 단계에서 얻은 배열의 이미지를 표시합니다.

    직접 할 수있는 경우

    image(weather1618); 
    

    파란색 이미지 만 나타납니다.

    좋은 발견! 파란색 이미지 만 표시되는 이유는 기본적으로 image 기능이 colormap의 전체 색상 범위를 사용하지 않기 때문에 정보에 이미지가 있어도 구별 할 수 없기 때문입니다 전체 색상 범위를 사용하여 표시되지 않습니다. 한편, imagesc 함수는 기본적으로 전체 색상 범위를 사용합니다. 그들은 모두 같은 이미지입니다

    img = rand(50);  % Random image with values from 0 to 1. 
    
    subplot(1, 2, 1); % Left plot. 
    image(img);   % Display image from array. 
    colorbar;   % Colorbar showing color scale. 
    
    subplot(1, 2, 2); % Right plot. 
    imagesc(img);  % Display image with scaled colors. 
    colorbar;   % Colorbar showing color scale. 
    

    image vs imagesc

    하지만, 색상 스케일링합니다 (colorbars 보면) 다른 :

    이 예를 살펴 내가 만들었습니다.

    .*50.*100 다른 이미지를 줄 않지만 .*100.*500.*1000은 동일?

    uint8 저장할 수있는 최대 값은 255이기 때문에, 값이 모두 초과 얻어진 255, 100, 500 (1000)에 의해 승산 이유 255 잘릴 수보다 크면 값이 전혀 차이가 없기 때문에 255.

  • +0

    와우! 나는 내가 많이 배웠다고 느낀다! 나에게 그렇게 명확하게 설명 할 시간을내어 주셔서 감사합니다! :디 – katarado