天天看點

python學習 圖檔粘貼,滑鼠單擊擷取位置坐标

一、要求

XR請我幫一個忙:幫他處理9張電鏡圖像,具體任務就是剪裁掉原來的坐标,按照新的格式加上标号和坐标:

python學習 圖檔粘貼,滑鼠單擊擷取位置坐标

先說一下我做完以後的總體感受:

1、變量、變量很重要!不要覺得一開始什麼都設一個變量很麻煩,如果是常量的話最後改來改去更麻煩。

2、最好把圖檔都預處理為統一大小,不然一張張剪裁調整太麻煩了。

3、盡可能減少人為計算。

3、我要用我的代碼做更多的事情!

二、思路

不知道python有沒有直接在圖檔上插入數字、符号的功能。

1、先在PPT裡把需要的刻度和标号做好,然後截圖或者導出圖檔儲存。就是因為有的是截圖,有的是直接從PPT導出(學了一招:把多個圖形“組合”成一個圖形),大小不一,給接下來的處理埋下了後患。

2、用python裡的pillow子產品将圖檔和标号、刻度粘貼在一起。

三、代碼

1、點選圖檔某處擷取位置坐标:

先确定一下需要粘貼的大緻位置,再對标号圖和刻度圖進行适當放縮。

def on_press(event):
    print("my position:" ,event.button,event.xdata, event.ydata)
fig = plt.figure()
plt.imshow(img, animated= True)# 把擷取的圖檔放進坐标軸
fig.canvas.mpl_connect('button_press_event', on_press)
plt.show()
           

可以看出标号的位置大約為:

my position: MouseButton.LEFT 213.69354838709677 99.24193548387086
           

2、擷取标号圖大小進行适當縮放:

直接從PPT裡導出的圖檔上下還有白邊邊,需要剪裁一下

(x_num,y_num) = img_num.size
print('x_num,y_num:', x_num, y_num)
img_num = img_num.crop((1,9,106,80))  # (left, upper, right, lower)
plt.imshow(img_num)
plt.show()
(x_num,y_num) = img_num.size
print('x_num,y_num:', x_num, y_num)
           

用同樣的方法處理尺度圖。

3、粘貼:

width_num = int(x_num*1.5)
height_num = int(y_num*1.5)
img_num = img_num.resize((width_num, height_num),Image.ANTIALIAS)

img_dim = img_dim.resize((int(x_dim*1.5),int(y_dim*1.5)), Image.ANTIALIAS)
#plt.imshow(img_dim)
#plt.show()

(x,y) = img.size #read image size
print( 'original size: ',x,y)#列印圖檔原始尺寸


box_num = (000,000,width_num, height_num)
box_dim = (x1-int(x_dim*1.5), y-int(y_dim*1.5), x, y)
img_cropped.paste(img_num, box_num)   # 粘貼圖檔
img_cropped.paste(img_dim, box_dim)
           

4、顯示、儲存圖檔:

plt.imshow(img_cropped)
plt.show()

out =img_cropped .resize((x1,y1),Image.ANTIALIAS) #resize image with high-quality
out.save(outfile)
           

全部代碼(單張圖檔):

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation

infile = 'D:\\lmr_cropped\\c_LMR_i005.tif'
infile_dim='D:\\lmr\\500nm.png'
infile_num='D:\\lmr\\5.png'
outfile = 'D:\\lmr\\a_LMR_i005.tif'




img = Image.open(infile,'r')#讀取圖檔
img_num = Image.open(infile_num,'r')#讀取标号
img_dim = Image.open(infile_dim,'r')#讀取尺度

def on_press(event):
    print("my position:" ,event.button,event.xdata, event.ydata)
fig = plt.figure()
plt.imshow(img, animated= True)# 把擷取的圖檔放進坐标軸
fig.canvas.mpl_connect('button_press_event', on_press)
plt.show()

(x_num,y_num) = img_num.size
print('x_num,y_num:', x_num, y_num)
img_num = img_num.crop((1,9,106,80))  # (left, upper, right, lower)
plt.imshow(img_num)
plt.show()
(x_num,y_num) = img_num.size
print('x_num,y_num:', x_num, y_num)

(x_dim,y_dim) = img_dim.size
print('x_dim,y_dim:', x_dim, y_dim)
plt.imshow(img_dim)
plt.show()

width_num = int(x_num*1.5)
height_num = int(y_num*1.5)
img_num = img_num.resize((width_num, height_num),Image.ANTIALIAS)

img_dim = img_dim.resize((int(x_dim*1.5),int(y_dim*1.5)), Image.ANTIALIAS)
#plt.imshow(img_dim)
#plt.show()

(x,y) = img.size #read image size
print( 'original size: ',x,y)#列印圖檔原始尺寸


box_num = (000,000,width_num, height_num)
box_dim = (x1-int(x_dim*1.5), y-int(y_dim*1.5), x, y)
img_cropped.paste(img_num, box_num)   # 粘貼圖檔
img_cropped.paste(img_dim, box_dim)


plt.imshow(img_cropped)
plt.show()

out =img_cropped .resize((x1,y1),Image.ANTIALIAS) #resize image with high-quality
out.save(outfile)
           

繼續閱讀