2017-03-17 7 views
2

matplotlib를 사용하여 2D 컬러 맵을 부드럽게하는 방법이 있다면 제 질문은 무엇입니까? 내 코드 : enter image description herematplotlib에서 2D 컬러 맵을 부드럽게하는 방법

은 픽셀의 전환을 평활에 의해 더 잘 만들 수있는 방법이 있나요 : 여기

def map(): 
    # setup parameters 
    j = 0 
    N = 719 
    N2 = 35 
    x = np.linspace(190, 800, N) 
    y = np.linspace(10, 360, N2) # (1,2,3), 1 - start Temp, 2- end temp + 10K, 3 - how many steps to reach it 
    z = [] 
    A = np.zeros([35,719]) # [1 2], 1 - number of spectras, 2 - delta wavelength 
    # run 
    for i in range(10,360,10): 
      Z = [] 
      file_no = (str(0) + str(i))[-3:] 
      data = np.genfromtxt('C:\\Users\\micha_000\\Desktop\\Measure\\' + '160317_LaPONd_g500_%s_radio.txt'%file_no,skip_header = 12) 
      for line in data: 
       Z.append(line[1]-6000) 
      A[j,:] = Z 
      j = j+1 
    X, Y = np.meshgrid(x,y) 
    fig, ax = plt.subplots() 
    cs = ax.contourf(X, Y, A, cmap=cm.viridis) 
    norm = colors.Normalize(vmin = 0, vmax = 1) 
    plt.xlabel('wavelength [nm]') 
    plt.ylabel('temperature [K]') 
    plt.title('LaPONd_g500') 
    cbar = fig.colorbar(cs, norm = norm) 
    plt.savefig('C:\\Users\\micha_000\\Desktop\\Measure\\LaPONd_g500_radio_map.png') 
    plt.show() 
    plt.close() 

그리고 내가받는 것의 예입니다?

+0

'imshow'는 암시 적으로'interpolate' 인수를 가지고 있습니다. 다음을 할 수 있습니까?'plt.show (interpolate = 'nearest')'? – Dair

답변

0

png를 배열로 열고 평균값 필터로 흐리게 처리합니다. 자세한 내용은 회선 필터 검색을 참조하십시오. 난 그냥 25 픽셀 사각형 평균 필터를 사용했지만, 당신이 ...

import numpy as np 
from scipy import ndimage, signal, misc 

img = ndimage.imread('C:/.../Zrj50.png') 

#I used msPaint to get coords... there's probably a better way 
x0, y0, x1, y1 = 87,215,764,1270 #chart area (pixel coords) 

#you could use a gaussian filter to get a rounder blur pattern 
kernel = np.ones((5,5),)/25 #mean value convolution 

#convolve roi with averaging filter 
#red 
img[x0:x1, y0:y1, 0] = signal.convolve2d(img[x0:x1, y0:y1, 0], kernel, mode='same', boundary='symm') 
#green 
img[x0:x1, y0:y1, 1] = signal.convolve2d(img[x0:x1, y0:y1, 1], kernel, mode='same', boundary='symm') 
#blue 
img[x0:x1, y0:y1, 2] = signal.convolve2d(img[x0:x1, y0:y1, 2], kernel, mode='same', boundary='symm') 

#do it again for ledgend area 
#... 

misc.imsave('C:/.../Zrj50_blurred.png', img) 

대신 가우스를 사용하여 부드럽게 보이게하기 위해 가우스 분포를 사용할 수는 매우 간단합니다 :

#red 
img[x0:x1, y0:y1, 0] = ndimage.gaussian_filter(img[x0:x1, y0:y1, 0], 4, mode='nearest') 
+1

대단히 감사합니다. :) – Maq92

+0

@ Maq92 미래에 이미지로 더 많은 일을 할 계획이라면 회선 필터를 읽는 것이 좋습니다. 거의 모든 이미지 처리가 수행되는 방법입니다. – Aaron

+0

이것은 플롯이 아닌 데이터를 매끄럽게 만듭니다. 그래서 나는 그것이 그 질문에 대한 답이라고 생각하지 않을 것입니다. – ImportanceOfBeingErnest

3

문제 (모두 matplotlib에서 매끄 럽습니다) 팔레트가 아니지만, 사실은 사용자가 하나의 색상으로 각각의 countours를 생성하고 따라서 매끄럽지 않은 contourf()을 사용하고 있다는 사실입니다. 기본값은 10 countours와 같은 것입니다.

(당신은 또한 레벨을 포함 할 수있는 배열 제공 할 수 있습니다) 수준을 지정하여 윤곽 수준의 수를 증가 :, 하나의 빠른 해결책 :이 데이터 데이터가 이미 보이기 때문에, 더 좋은

cs = ax.contourf(X, Y, A, cmap=cm.viridis, levels=100) 

을 (예 : 각 픽셀의 X, Y, Z 값) 그리드에서 윤곽 대신 pcolormesh(X,Y,A)을 사용해야합니다. 그것은 단계가 아닌 완전히 연속 된 값으로 그릴 것입니다.