【问题标题】:Identify curve in binary image识别二值图像中的曲线
【发布时间】:2016-06-13 13:34:24
【问题描述】:

我有一些显示曲线的实验截图,我想将该曲线提取到一个数组中以分析数据。

我的方法的第一部分是将图像转换为具有良好选择的阈值的二进制图像,该阈值仅留下曲线。这很好用,但第二部分包括从曲线中提取一个数组却没有。我尝试了浏览图片并识别白色像素的“幼稚”方法,但结果与预期相去甚远。

有人有解决办法吗?

import numpy as np
import matplotlib.pyplot as plt
import PIL.Image as img

gray = img.open('0100k.jpg').convert('L')
bw = gray.point(lambda x: 0 if x<240 else 255, '1')
bw = bw.convert('1')
bw.show()
pix = np.array(bw)
(n,m) = pix.shape
curve = np.zeros(n)
for i in range(n):
    for j in range(m):
        if pix[i,j] == 1:
        curve[i] = j
plt.plot(curve)
plt.show()

【问题讨论】:

  • 我不禁想知道您是否将ij 颠倒了,因为np.array 返回一个列表列表。第一个元素访问内部列表(垂直),第二个元素访问每个列表的各个元素(水平)。
  • 你是对的。另外,0,0 点在左上角,所以为了让它工作,我发现这样更好:(n,m) = pix.shape curve = np.zeros(m) for i in range(n): for j in range(m): if pix[i,j] == 1: curve[j] = n-i
  • 啊,好吧,我很高兴你知道了。这也是我沮丧的根源。在所有数学中,原点都在左下角。为什么许多图书馆坚持不这样,我无法理解。

标签: python python-2.7 matplotlib


【解决方案1】:

谢谢大家,该方法现在有效,解决方案是将 i 和 j 正确分配给它们各自的维度。感谢@Matt Cremens 指出这一点。
但是情节变厚了,它检测到一些不存在的像素,比如图片左侧可见的像素:http://s31.postimg.org/i0conbbxn/figure_1.png

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2016-07-11
    • 2019-04-25
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多