sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据
算開(kāi)個(gè)頭,不算特別實(shí)戰(zhàn)
掃描電子顯微鏡,材料開(kāi)發(fā)不可缺少的分析儀器。原理就不詳述了。材料的形貌,具體長(zhǎng)什么樣的都可以看得很清楚。
材料表面的形貌很多情況下會(huì)和材料的物性產(chǎn)生直接關(guān)系,比如說(shuō)可以從SEM看出粒子的直徑分布,多孔材料的孔徑等等。孔徑這個(gè)就很直接了,孔徑越小,材料的表面積越大,有可能相對(duì)的化學(xué)活性比如說(shuō)氣體的吸收能力會(huì)更大。
所以,有可能可以利用SEM作為材料的描述符X,建立模型來(lái)預(yù)測(cè)有關(guān)的物性?現(xiàn)在手邊沒(méi)有這樣子的數(shù)據(jù),但是覺(jué)得可能這方面的先行研究應(yīng)該有一些吧。之前曾經(jīng)有提到一塊錢(qián)買(mǎi)中巴:機(jī)器學(xué)習(xí)在材料方向的應(yīng)用(lightgbm+貝葉斯優(yōu)化調(diào)參)?zhuanlan.zhihu.com
可以用組成來(lái)預(yù)測(cè)物性。在這里,如果我們有組成,加上圖像數(shù)據(jù),應(yīng)該可以得到更高的精度??可惜好像還沒(méi)有系統(tǒng)性的數(shù)據(jù)
python有skimage這個(gè)包可以對(duì)材料進(jìn)行一些預(yù)處理。對(duì)于材料的SEM也可以進(jìn)行一些有意思的操作。哈佛大學(xué)有一個(gè)很簡(jiǎn)單的SEM的數(shù)據(jù)庫(kù),里面有四種材料的SEM圖,但是好像沒(méi)有標(biāo)記,然后每種材料的樣本也不大就四張圖。可以在下面的地址下載https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/HVBW0Q#__sid=js0?dataverse.harvard.edu
首先對(duì)數(shù)據(jù)進(jìn)行讀取。這里我選擇的是兩張多孔粒子的圖像
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é)對(duì)不住了。這里修改一下選項(xiàng)as_gray可以使得圖片變成更加鮮明的樣子。讀取了兩張圖,其中一張長(zhǎng)這樣
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)
這個(gè)圖下面有具體的拍照時(shí)間比例尺什么資料,我們可以把這一塊鋸掉。實(shí)際上讀取這個(gè)數(shù)據(jù)之后,這是一個(gè)像素的矩陣,把對(duì)應(yīng)坐標(biāo)部分的數(shù)據(jù)去掉就可以了。
fig = plt.plot(figsize=(3, 3))
plt.imshow(imgg[:-100])
接下來(lái)我們可以對(duì)圖片進(jìn)行特征點(diǎn)提取
特征點(diǎn)是圖像處理中,特征點(diǎn)指的是圖像灰度值發(fā)生劇烈變化的點(diǎn)或者在圖像邊緣上曲率較大的點(diǎn)(即兩個(gè)邊緣的交點(diǎn))。
百度百科里這樣定義的。這里的特征點(diǎn)則可以反應(yīng)出一些孔的有關(guān)信息。這個(gè)很重要因?yàn)橹耙舱f(shuō)了會(huì)對(duì)物性產(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])
特征點(diǎn)可視化之后是這樣的。注意一下這里的特征點(diǎn)圖是90度翻轉(zhuǎn)過(guò)的。
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是二號(hào)圖像,與一號(hào)圖像相比似乎別無(wú)兩樣。
對(duì)照一號(hào)圖片的特征點(diǎ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],
'.',)
特征點(diǎn)和特征點(diǎn)之間出現(xiàn)了一定程度的偏移。將特征點(diǎn)投影到原圖,可以進(jìn)一步觀察對(duì)應(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)
可以觀察到提取的特征點(diǎn)分布在孔的附近。具體看一下兩張圖的特征點(diǎn)之間的距離以及分布
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))
這兩張圖之間的大部分圖還是匹配的。接下來(lái)看一看距離在100以上的有點(diǎn)異常的特征點(diǎn)
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],
'.',)
還是可接受的吧。可能因?yàn)榱炼仁裁吹幕蛟S有些不同?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)图像数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python聚类分析案例_深度解读|如何
- 下一篇: oracle如何收缩表空间,ORACLE