sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据
算開個頭,不算特別實戰(zhàn)
掃描電子顯微鏡,材料開發(fā)不可缺少的分析儀器。原理就不詳述了。材料的形貌,具體長什么樣的都可以看得很清楚。
材料表面的形貌很多情況下會和材料的物性產(chǎn)生直接關(guān)系,比如說可以從SEM看出粒子的直徑分布,多孔材料的孔徑等等。孔徑這個就很直接了,孔徑越小,材料的表面積越大,有可能相對的化學(xué)活性比如說氣體的吸收能力會更大。
所以,有可能可以利用SEM作為材料的描述符X,建立模型來預(yù)測有關(guān)的物性?現(xiàn)在手邊沒有這樣子的數(shù)據(jù),但是覺得可能這方面的先行研究應(yīng)該有一些吧。之前曾經(jīng)有提到一塊錢買中巴:機器學(xué)習(xí)在材料方向的應(yīng)用(lightgbm+貝葉斯優(yōu)化調(diào)參)?zhuanlan.zhihu.com
可以用組成來預(yù)測物性。在這里,如果我們有組成,加上圖像數(shù)據(jù),應(yīng)該可以得到更高的精度??可惜好像還沒有系統(tǒng)性的數(shù)據(jù)
python有skimage這個包可以對材料進行一些預(yù)處理。對于材料的SEM也可以進行一些有意思的操作。哈佛大學(xué)有一個很簡單的SEM的數(shù)據(jù)庫,里面有四種材料的SEM圖,但是好像沒有標(biāo)記,然后每種材料的樣本也不大就四張圖。可以在下面的地址下載https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/HVBW0Q#__sid=js0?dataverse.harvard.edu
首先對數(shù)據(jù)進行讀取。這里我選擇的是兩張多孔粒子的圖像
from skimage.io import imread
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from pathlib import Path
import numpy as np
%matplotlib inline
plt.rcParams["figure.figsize"] = (8, 8)
plt.rcParams["figure.dpi"] = 150
plt.rcParams["font.size"] = 14
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['DejaVu Sans']
plt.style.use('ggplot')
sns.set_style("whitegrid", {'axes.grid': False})
imgg=imread('...../archive/3dsem/Pollen1001.jpg')
fig = plt.plot(figsize=(3, 3))
plt.imshow(imgg)
多孔材料嘛。有密集恐懼癥的同學(xué)對不住了。這里修改一下選項as_gray可以使得圖片變成更加鮮明的樣子。讀取了兩張圖,其中一張長這樣
imgg=imread('/Users/yweilin/Desktop/study/code/archive/3dsem/Pollen1001.jpg', as_gray=True)
imgg2=imread('/Users/yweilin/Desktop/study/code/archive/3dsem/Pollen1002.jpg', as_gray=True)
fig = plt.plot(figsize=(3, 3))
plt.imshow(imgg)
這個圖下面有具體的拍照時間比例尺什么資料,我們可以把這一塊鋸掉。實際上讀取這個數(shù)據(jù)之后,這是一個像素的矩陣,把對應(yīng)坐標(biāo)部分的數(shù)據(jù)去掉就可以了。
fig = plt.plot(figsize=(3, 3))
plt.imshow(imgg[:-100])
接下來我們可以對圖片進行特征點提取
特征點是圖像處理中,特征點指的是圖像灰度值發(fā)生劇烈變化的點或者在圖像邊緣上曲率較大的點(即兩個邊緣的交點)。
百度百科里這樣定義的。這里的特征點則可以反應(yīng)出一些孔的有關(guān)信息。這個很重要因為之前也說了會對物性產(chǎn)生影響。
from skimage.feature import corner_harris, corner_peaks, ORB
descriptor_extractor = ORB(n_keypoints=1000)
def extract_points(in_img):
descriptor_extractor.detect_and_extract(in_img)
return {'keypoints': descriptor_extractor.keypoints,
'descriptors': descriptor_extractor.descriptors}
extracted_image=extract_points(imgg[:-100])
extracted_image2=extract_points(imgg2[:-100])
特征點可視化之后是這樣的。注意一下這里的特征點圖是90度翻轉(zhuǎn)過的。
fig = plt.plot(figsize=(3, 3))
plt.plot(extracted_image['keypoints'][:, 0],
extracted_image['keypoints'][:, 1],
'.',)
# plt.plot(extracted_image2['keypoints'][:, 0],
# extracted_image2['keypoints'][:, 1],
# '.',)
這里imgg2是二號圖像,與一號圖像相比似乎別無兩樣。
對照一號圖片的特征點可以看出似乎還是有一些不同之處的。
fig = plt.plot(figsize=(3, 3))
plt.plot(extracted_image['keypoints'][:, 0],
extracted_image['keypoints'][:, 1],
'.',)
plt.plot(extracted_image2['keypoints'][:, 0],
extracted_image2['keypoints'][:, 1],
'.',)
特征點和特征點之間出現(xiàn)了一定程度的偏移。將特征點投影到原圖,可以進一步觀察對應(yīng)信息
from skimage.feature import match_descriptors, plot_matches
c_matches = match_descriptors(extracted_image['descriptors'],extracted_image2['descriptors'], cross_check=True)
fig = plt.plot(figsize=(3, 3))
plot_matches(plt,
imgg[:-100], imgg2[:-100],
extracted_image['keypoints'], extracted_image2['keypoints'],
c_matches)
可以觀察到提取的特征點分布在孔的附近。具體看一下兩張圖的特征點之間的距離以及分布
dist_list=[]
for i, (c_idx, n_idx) in enumerate(c_matches):
x_vec = [extracted_image['keypoints'][c_idx, 0], extracted_image2['keypoints'][n_idx, 0]]
y_vec = [extracted_image['keypoints'][c_idx, 1], extracted_image2['keypoints'][n_idx, 1]]
dist = np.sqrt(np.square(np.diff(x_vec))+np.square(np.diff(y_vec)))[0]
dist_list.append(dist)
dist_list_df=pd.DataFrame(dist_list,columns=['distance'])
dist_list_df.hist(figsize=(5, 5))
這兩張圖之間的大部分圖還是匹配的。接下來看一看距離在100以上的有點異常的特征點
outlier=[]
outlier_index=[]
for x in dist_list:
if x > 100:
outlier.append(x)
outlier_index.append(dist_list.index(x))
fig = plt.plot(figsize=(3, 3))
plt.plot(extracted_image['keypoints'][:, 0][outlier_index],
extracted_image['keypoints'][:, 1][outlier_index],
'.',)
plt.plot(extracted_image2['keypoints'][:, 0][outlier_index],
extracted_image2['keypoints'][:, 1][outlier_index],
'.',)
還是可接受的吧。可能因為亮度什么的或許有些不同?https://github.com/onecoinbuybus/chemoinformatics/blob/master/matinfo.ipynb?github.com
參考了kaggle看到的文章https://www.kaggle.com/kmader/3dsem-a-dataset-for-3d-sem-surface-reconstruction?www.kaggle.com
總結(jié)
以上是生活随笔為你收集整理的sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python聚类分析案例_深度解读|如何
- 下一篇: oracle如何收缩表空间,ORACLE