我要分析数以万计的文本文件,其中每个文本文件代表系统物理状态的快照。每个“像素”的微观状态用浮点数从0到1表示。是否可以让OpenCV直接读取文本文件,而不必首先将文本文件转换成图像格式?,我不想每次执行此分析时都创建数万个图像文件。
上下文/目标:I正在分析纳米磁性系统的热模拟,最终需要使用OpenCV来计算在一定阈值以上形成的团簇的轮廓区域。
我在下面包含了我的代码尝试,使用了一个测试文本文件。该系统是一个侧面长度为40的正方形系统,我正在分析40^2 = 1600个数据点的列,我称之为mag (用于磁化,因为这是来自一个科研项目)。我把每个“像素”乘以255来模拟灰度。一旦程序到达cv2阈值行,我就会得到一个错误:
~/anaconda/conda-bld/work/opencv-2.4.8/modules/imgproc/src/thresh.cpp:783:错误:(-210)函数阈值
我怀疑这是因为我模仿灰度,而不是读取实际的灰度图像文件。
import numpy as np
import cv2
SideDim = 40
dud, mag = np.loadtxt('Aex_testfile.txt', unpack=True, usecols=(4,5), skiprows=2)
mag = np.reshape(mag, (SideDim,SideDim))
for row in range(SideDim):
for col in range(SideDim):
mag[row][col] = round(255 * mag[row][col])
mag = mag.astype(np.int)
ret,thresh = cv2.threshold(mag,0,255,cv2.THRESH_BINARY)
plt.imshow(thresh,'gray')发布于 2016-10-24 14:36:03
关于你的职位标题中的问题:
在Python中,CV2不将文本转换为图像格式。相反,“图像”只是数字数组。然后,您将正确地使用np.loadtxt导入数据(尽管我倾向于使用np.genfromtxt(),因为它稍微更健壮)。
关于您正在收到的错误:
错误代码-210定义为:
#定义CV_StsUnsupportedFormat -210 /*函数不支持数据格式/类型
cv2.threshold()使用8位整数。与其将mag转换为np.int,不如将其转换为np.uint8。这将修复您的错误。
其他要注意的事项:
对于numpy数组,不需要使用这些丑陋的嵌套循环将每个值乘以255。相反,只需做mag * 255。
与其乘以255 (除非您的最大值为1.),否则这是不太合理的,您应该将数组规范化。像(mag / mag.amax()) * 255这样的东西是一个更好的解决方案。
你不需要公开的简历,为这部分的计划。相反,您可以在numpy中这样做:
thresh = 255 * (mag > threshval)这将产生一个数组(阈值),其值大于阈值集等于255。
总的来说,我认为在进入opencv之前学习numpy是应该的。我想你会对你能做这么多事情感到惊讶。
https://stackoverflow.com/questions/40210197
复制相似问题