使用Python将图片转换成矩阵并做数据提取


版权声明:本文为博主原创文章,如需转载请贴上原博文链接:https://blog.csdn.net/u011628215/article/details/106187916


前言:在前一篇关于PyCharm中遇到exit code -1073740791 (0xC0000409)的问题及其解决方法中有提到将图片中的曲线提取出来,并使用神经网络进行曲线拟合,第一步实现了,但神经网络拟合效果始终不理想(可能是选择的模型不合适),这里先将第一步记录于此。

 

正文:

如图1所示,先将图片导入,看似平滑的曲线但将其放大后,就能看到一个个像素点(如图2所示,这里只截取了其中一部分)。

使用Python将图片转换成矩阵并做数据提取_第1张图片 图1 需要提取曲线的原始图片
使用Python将图片转换成矩阵并做数据提取_第2张图片 图2 图1中一部分放大区域的曲线

为了将曲线的数据提取出来,首先需要确定使用什么提取条件或者说提取规则。因为图片中底色是白色(RGB:255,255,255),而蓝色曲线最外围的像素色块以及最外围周边的色块颜色都相对会淡一些,故这里选取的颜色分离标准的RGB为[60,120,160],即RGB小于这一数值的像素色块就提取出,并将其手动灰度化(有专门的函数灰度化,但为了后续能更好的提取坐标点,这里手动将色块RGB设置为[0,0,0],即黑色),而高于这一RGB值的色块,均将其RGB值手动设置为[255,255,255],即白色(手动设置RGB值,即将一个矩阵内的数值进行修改,这里遇到一个问题,记为:问题1)。

经过上述规则筛选并灰度化后的曲线如图3所示,可见有些像素点已经被去除但曲线主体已基本呈现,接下来就是对这些灰度像素进行坐标提取。

使用Python将图片转换成矩阵并做数据提取_第3张图片 图3 将图1中的曲线灰度化后的结果

如图4中的两幅图所示,其中b图是根据灰度曲线选取的点,a图是将选取后的点与原始图1做对比,可见提取后的坐标点与原始图基本完全匹配。

使用Python将图片转换成矩阵并做数据提取_第4张图片 图4 将灰度曲线转换成坐标并以点标出

 

问题1:矩阵只可读取,禁止写入

使用Python将图片转换成矩阵并做数据提取_第5张图片 图5 修改pic_矩阵数组

手动设置RGB,即将矩阵数组中的值进行修改,但是遇到一些问题,以图5中的pic_数组(该数组为三维数组,如果修改其中一维需要写成pic_[0][0])为例,会报错“ValueError: assignment destination is read-only”(如以下代码所示),显然直接更改矩阵中的值是不可取的;

pic_[0][0] = np.array([0, 0, 0], dtype='uint8')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: assignment destination is read-only

在经过网上查找之后,发现可以更改矩阵的读写状态(见参考文献1),但依然报错。

pic_.flags.writeable = True
Traceback (most recent call last):
  File "", line 1, in 
ValueError: cannot set WRITEABLE flag to True of this array

具体原因可能是参考文献2中的所说的python和numpy库的版本不匹配,但是我没有深入研究,而是通过文献2中评论的方法解决了问题,就是使用np.array()函数将想要改变的数值的矩阵重新生成一次,然后再修改属性,如以下代码所示。

pic__ = np.array(pic_)
pic__.flags.writeable = True
print(pic__[0][0])
pic__[0][0] = np.array([0, 0, 0], dtype='uint8')
print(pic__[0][0])

# 运行结果
[255 255 255]
[0 0 0]

 

参考文献:(感谢以下文献的贡献者们!)

1.Python Numpy.ndarray ValueError:assignment destination is read-only

2.如何解决 cannot set WRITEABLE flag to True 问题

你可能感兴趣的:(问题及解决方案,学习记录)