为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

萧十郎 2022-01-05 11:36:24
我有一个图像:>>> 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如何使用它在原始图像空间中绘制线条?特别是:.reshape() 返回图像空间的正确反向索引是什么?这似乎有点麻烦。这种reshape reshape dance在图像处理中是不是很常见?上面描述的是执行此操作的标准方法,还是有不同的方法?如果映射到 720, 1280, 1 数组称为图像空间,那么重构空间称为什么?数据空间?线性化空间?
查看完整描述

1 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

你不需要这样做。你可以结合np.nonzero,np.polyfit和np.polyval来做到这一点。它看起来像这样:


import numpy as np

from matplotlib import pyplot as plt


# in your case, you would read your image

# > cv2.imread(...)  # import cv2 before

# but we are going to create an image based on a polynomial

img = np.zeros((400, 400), dtype=np.uint8)

h, w = img.shape

xs = 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 this

ys, xs = np.nonzero(img)  # use (255-img) if your image is inverted

ys = h - ys


# compute the coefficients

coefs = 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 index

xx = 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 result

color_img = np.repeat(img[:, :, np.newaxis], 3, axis=2)

color_img[yy, xx, 0] = 255  # 0 because pyplot is RGB

f, 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()

结果如下所示:

//img1.sycdn.imooc.com//61d5125a0001ab7a12980705.jpg

如果您打印coefs,您将拥有[ 1.00486819e-02 -4.01966712e+00  6.01540472e+02][0.01, -4, 600]我们选择的非常接近的。


查看完整回答
反对 回复 2022-01-05
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信