Looking for something?

In Standard

提取图片数据小程序

提取图片数据小程序

在做模拟的时候经常需要和其他人的试验结果进行对比,以验证模拟结果的正确性,但是从他人论文中看到的试验结果的呈现方式基本以图片为主,但是将他人试验结果与自己的模拟结果进行对比,就必须将图片逆向转化为数据。有人提供了一种基于Mathematica的图片处理方法。

例如下面这张图片:

1

通过如下代码导入该图,

这是从他人论文里截取出来的图片,记录的是某试件的滞回曲线,图片本质上多个像素排列组合,因此需要在像素与试验数据间建立转化关系,这里我选择了{0, 0}, {0, 250}, {80,0}这三个点,然后我们获得这三个实际数据点在图中的像素坐标位置,这个可以先用Import[ ]这个函数将图片导入进来,然后右键图片,选择获取坐标选项,点击这三个点在图片上的位置,然后Ctrl+C获得这三个点的像素坐标。这里的像素坐标是:

基于这三个点将图中像素与实际数据之间的转化关系建立起来,用的是FindGeometricTransform[pt1,pt2]函数,这个函数可以求将pt2指定的位置与pt1对齐的几何变换得到对齐误差与变换函数,代码如下所示,trans即为变换函数

接下来的另一个是删除图中不需要的像素,即那些与试验数据无关的像素,比如用于呈现坐标轴的像素,这里有必要补充一些常识,图中为了显示出不同颜色,用了多个像素值,这使得像素的处理变得非常麻烦,因此有必要采用一个函数对图中不同像素值进行归一化处理,把相近的像素整为一类以便于下一步处理,代码如下,按照颜色的规范化光栅数据,对于黑白来说{0,0,0}表示黑色,{1,1,1}表示白色,其他颜色介于二者之间。ImageData[image] 给出 image 或者 Image3D 对象 image 中像素值构成的阵列.Round[x,a]近似为最接近的 a 的倍数,在归一化后,程序只需要处理七种颜色。

采用归一化后的像素值显示图像,代码如下:

为了显示同种颜色图中有很多相等的像素值,采用如下代码可将多个相同像素值写成一个:

这时候的data是一个三维矩阵,因为除了图片的二维之外,每个点还有三个颜色数据,将其中的重复数据删除之后,用Graphics[ ]命令将图像绘制成圆盘格式查看其在图中呈现的颜色种类,即黑色,蓝色和白色。

这时我们将蓝色保护起来,其他颜色一律整为白色

但是这样还是可能存在一点问题,就是坐标轴的位置还是有白色。这时候一串图形处理模式就用上来了,首先进行高斯滤波,去除这个白点,GaussianFilter[image,r]通过与像素半径 r 的一个高斯内核的卷积来对 image 进行滤波.但是处理完后图像会变得较为模糊,这时采用二值化函数高清显示图像,Binarize[image] 从 image 创建一个二值图像,用 1 (白色)替换所有超过全局性阈值的值,其它用 0 (黑色)替换.

再对图中颜色用互补色进行转换

通过下面的代码,将binImage这个图片用黑色填充,当然这是在有pic这个类似于遮罩的模式保护下进行的,这样就可以得到下面的清晰的数据图了:

ES77V3

最后用到Position函数,Position[expr,pattern]给出在 expr 中匹配 pattern 的对象的位置列表。用这个函数可以把上图中显示为白色的像素位置提取出来,然后对X,Y坐标进行反转

将数据图绘制出来,如下图所示:

213

将数据导入Excel,代码如下:

用Origin绘制出来,如下图所示。

Graph1

 

1 Comment 1307 Views

Related Post

1 Comment

  1. 不更新了呀

Leave a Reply