一、要求
XR请我帮一个忙:帮他处理9张电镜图像,具体任务就是剪裁掉原来的坐标,按照新的格式加上标号和坐标:
先说一下我做完以后的总体感受:
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)