Đầu tiên, hãy đọc những hình ảnh qua
from scipy.misc import imread
im = imread("thefile.png")
này đưa ra một mảng NumPy 3D với không gian thứ ba là kênh màu (RGB + alpha). Đường cong nằm trong kênh màu xanh dương, nhưng lưới cũng ở đó. Nhưng trong kênh màu đỏ, bạn có lưới và không phải là đường cong. Vì vậy, chúng tôi sử dụng
a = im[:,:,2] - im[:,:,0]
Bây giờ, chúng tôi muốn vị trí tối đa dọc theo mỗi cột. Với độ chính xác một pixel, nó được cho bởi
y0 = np.argmax(a, axis=0)
Kết quả của số không là khi không có đường cong màu xanh trong cột, tức là bên ngoài khung. Bật có thể nhận được các giới hạn của khung bằng cách
xmin, xmax = np.where(y0>0)[0][[0,-1]
Với điều này, bạn có thể rescale trục x.
Sau đó, bạn muốn độ phân giải subpixel. Chúng ta hãy tập trung vào một cột duy nhất
f=a[:,x]
Chúng tôi sử dụng một sự lặp lại duy nhất của phương pháp Newton để tinh chỉnh vị trí của một cực trị
y1 = y0 - f'[y]/f''[y]
Lưu ý rằng chúng ta không thể lặp lại nữa vì việc lấy mẫu kín đáo. Nontheless, chúng tôi muốn một xấp xỉ tốt của các dẫn xuất, vì vậy chúng tôi sẽ sử dụng một chương trình 5 điểm cho cả hai.
coefprime = np.array([1,-8, 0, 8, -1], float)
coefsec = np.array([-1, 16, -30, 16, -1], float)
y1 = y0 - np.dot(f[y0-2:y0+3], coefprime)/np.dot(f[y0-2:y0+3], coefsec)
P.S. : Thorsten Kranz nhanh hơn tôi (ít nhất là ở đây), nhưng câu trả lời của tôi có độ chính xác subpixel và cách tôi trích xuất đường cong màu xanh có lẽ dễ hiểu hơn.
Câu hỏi thú vị, tôi đang làm việc trên một giải pháp, nhưng độ chính xác của pixel phụ là không thể. –
Chỉ bán tự động nhưng vẫn liên quan đến câu hỏi, ứng dụng web này có thể làm điều kỳ diệu: http://arohatgi.info/WebPlotDigitizer/ –