2013-12-04 3 views
12

Как я могу нарисовать правильные линии сетки над изображением tiff? Я хочу нарисовать правильные квадратные сетки для каждого интервала (скажем, 100 на 100 пикселей) над изображением и сохранить его с чертежами. Мне также необходимо наложить каждый идентификатор сетки как «1», «2», ... посередине каждого окна сетки.рисовать линии сетки над изображением в matplotlib

ответ

16

Вам понадобится библиотека изображений python (PIL). (См. Здесь https://pypi.python.org/pypi/PIL). См этих ответов примеров способов установки PIL: answer 1, answer 2

справа, что установлено, следующий код должен делать то, что вы просите:

import matplotlib.pyplot as plt 
import matplotlib.ticker as plticker 
try: 
    from PIL import Image 
except ImportError: 
    import Image 

# Open image file 
image = Image.open('myImage.tiff') 
my_dpi=300. 

# Set up figure 
fig=plt.figure(figsize=(float(image.size[0])/my_dpi,float(image.size[1])/my_dpi),dpi=my_dpi) 
ax=fig.add_subplot(111) 

# Remove whitespace from around the image 
fig.subplots_adjust(left=0,right=1,bottom=0,top=1) 

# Set the gridding interval: here we use the major tick interval 
myInterval=100. 
loc = plticker.MultipleLocator(base=myInterval) 
ax.xaxis.set_major_locator(loc) 
ax.yaxis.set_major_locator(loc) 

# Add the grid 
ax.grid(which='major', axis='both', linestyle='-') 

# Add the image 
ax.imshow(image) 

# Find number of gridsquares in x and y direction 
nx=abs(int(float(ax.get_xlim()[1]-ax.get_xlim()[0])/float(myInterval))) 
ny=abs(int(float(ax.get_ylim()[1]-ax.get_ylim()[0])/float(myInterval))) 

# Add some labels to the gridsquares 
for j in range(ny): 
    y=myInterval/2+j*myInterval 
    for i in range(nx): 
     x=myInterval/2.+float(i)*myInterval 
     ax.text(x,y,'{:d}'.format(i+j*nx),color='w',ha='center',va='center') 

# Save the figure 
fig.savefig('myImageGrid.tiff',dpi=my_dpi) 

Что, если он используется на grace_hopper.png примере файл , производит следующий вывод:

Image with numbered grid

+0

Как можно изменить цвет линий в сетке? – CristianCV

+0

'ax.grid (which = 'major', axis = 'both', linestyle = '-', color = 'r')' изменит их на красный – tom

+0

Большое спасибо! : D – CristianCV

7

Это может быть сделано эффективно в двух строках, обернув над данными изображений в ваших интервалах сетки. Использование canonical image из базы данных SIPI в качестве примера

import pylab as plt 

# Load the image 
img = plt.imread("lena512color.tiff") 

# Grid lines at these intervals (in pixels) 
# dx and dy can be different 
dx, dy = 100,100 

# Custom (rgb) grid color 
grid_color = [0,0,0] 

# Modify the image to include the grid 
img[:,::dy,:] = grid_color 
img[::dx,:,:] = grid_color 

# Show the result 
plt.imshow(img) 
plt.show() 

enter image description here

Ответ на @tom может быть более надежным, как он работает с библиотекой Matplotlib. Я оставлю этот пример своей простотой.

Смежные вопросы