猿问

将多项式拟合转换回图像空间

我有一个图像:


>>> image.shape

(720, 1280)

我的图像是 0 和 255 的二进制数组。我已经做了一些粗略的边缘检测,现在我想通过这些点拟合多项式。


我想在图像空间中的原始图像上看到这些点。


据我所知,执行此操作的标准方法是使用重塑展开 x,y- 图像,适合展开的版本,然后重新塑造回原始图像。


pts = np.array(image).reshape((-1, 2))

xdata = pts[:,0]

ydata = pts[:,1]

z1 = np.polyfit(xdata, ydata, 1) 

z2 = np.polyfit(xdata, ydata, 2)  # or quadratic...

f = np.poly1d(z)

既然我有了这个功能,我该f如何使用它在原始图像空间中绘制线条?

特别是:

  1. .reshape() 返回图像空间的正确反向索引是什么?

  2. 这似乎有点麻烦。这种reshape reshape dance在图像处理中是不是很常见?上面描述的是执行此操作的标准方法,还是有不同的方法?

  3. 如果映射到 720, 1280, 1 数组称为图像空间,那么重构空间称为什么?数据空间?线性化空间?


萧十郎
浏览 150回答 1
1回答

慕田峪9158850

你不需要这样做。你可以结合np.nonzero,np.polyfit和np.polyval来做到这一点。它看起来像这样:import numpy as npfrom matplotlib import pyplot as plt# in your case, you would read your image# > cv2.imread(...)&nbsp; # import cv2 before# but we are going to create an image based on a polynomialimg = np.zeros((400, 400), dtype=np.uint8)h, w = img.shapexs = np.arange(150, 250)ys = np.array(list(map(lambda x: 0.01 * x**2 - 4*x + 600, xs))).astype(np.int)img[h - ys, xs] = 255# I could use the values I have, but if you have a binary image,# you will need to get them, and you could do something like thisys, xs = np.nonzero(img)&nbsp; # use (255-img) if your image is invertedys = h - ys# compute the coefficientscoefs = np.polyfit(xs, ys, 2)xx = np.arange(0, w).astype(np.int)yy = h - np.polyval(coefs, xx)# filter those ys out of the image, because we are going to use as indexxx = xx[(0 <= yy) & (yy < h)]yy = yy[(0 <= yy) & (yy < h)].astype(np.int) # convert to int to use as index# create and display a color image just to viz the resultcolor_img = np.repeat(img[:, :, np.newaxis], 3, axis=2)color_img[yy, xx, 0] = 255&nbsp; # 0 because pyplot is RGBf, ax = plt.subplots(1, 2)ax[0].imshow(img, cmap='gray')ax[0].set_title('Binary')ax[1].imshow(color_img)ax[1].set_title('Polynomial')plt.show()结果如下所示:如果您打印coefs,您将拥有[ 1.00486819e-02 -4.01966712e+00 &nbsp;6.01540472e+02]与[0.01, -4, 600]我们选择的非常接近的。
随时随地看视频慕课网APP

相关分类

Python
我要回答