我是 opencv 的新手,我想將多個圖表影像轉換為陣列

我們可以放任意比例,我們只需要將影像中顯示的圖形的值作為資料,如果我們再次繪制,我們必須具有相同的顯示。
關于如何開始的任何想法?
uj5u.com熱心網友回復:
讓我們試一試
import cv2
import numpy as np
from matplotlib import pyplot as plt
im=cv2.imread('in.jpg') # Your image
H,W,D=im.shape # Shape of your image.
whiteness=im.sum(axis=2) # Sum of R G B
# For each x, compute first pixel (starting from top) which is not white
# (255*3=765. So, I tolerate a small margin. Visible pixels would be way
# under 760)
# Note that argmax stops whenever it founds a True
# Note also that if the whole column is white, it will return 0.
# We assume that 0 is not a valid value
# (If it is, we could also check if whiteness[y[x]] is really < 760)
y=np.array([np.argmax(whiteness[:,x]<760) for x in range(W)])
xmin=np.argmax(y>0) # Ignore margin
y=y[xmin:]
y=max(y)-y # Reverse the values (since y is 0 up for images, and down for charts)
plt.plot(y)
plt.show()
但是,你需要大量的自動化:
- 我洗掉邊距是基本的,可能不適用于其他示例。
- 你說你不關心縮放,但你可能關心0在哪里。這里假設它是最大值(即圖表坐標中的最小值)值。您可能想要檢測 x 軸。
- 如您所見,當您仔細觀察時,它不是很光滑。這是由于您的圖片中存在一些抗鋸齒(像素值不會直接從白色變為黑色),這使得它在恰好超過 760 閾值時有點隨機。您可能希望 1. 嘗試其他閾值。或者進行后處理平滑。
- 您還可以利用這種抗鋸齒功能來獲得亞像素解析度。因此,它不是不利的,而是相反的。但這很棘手,因為您必須對抗鋸齒進行一點“逆向工程”(鄰居的影響,最小值,因為沒有什么說曲線是嚴格黑色的,...)
- 編輯:再看一遍,你有一個比影像中的抗鋸齒更嚴重的問題:它是 jpg 編碼的一些“回聲”像素。這應該通過降低很多門檻來輕松解決。
但是,嗯,這就是你想要的開始,我猜。
另外,請注意,我在 numpy 中犯了最嚴重的罪行:迭代像素。當然,僅在行上,所以這并不完全糟糕(最糟糕的是在 x,y 上迭代)。但是,我很確定,有一種方法可以用純 numpy 操作來做同樣的事情。至少,使用 np.vectorize,但我想保持代碼清晰,因為它更像是一個教學代碼而不是真正的代碼。

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/515007.html
上一篇:如何過濾矩陣的元素?
