让我说我的图像有些黑色像素。 我知道所有黑色像素的坐标,并且我正在寻找黄线。
给定:我图像中黑色像素的坐标。
寻找:最适合黑色像素的黄色多项式
import cv2
import numpy as np
cv2.imread("foo.jpg")
#search for the black pixels and save the coordinates.
#coordinates of all pixels (example)
x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
z = np.polyfit(x, y, 2)
p = np.poly1d(z)
如果我正确理解了所有内容,那么现在我使用np.poly1d()
创建了多项式(图像上的黄线)。
但是如何在我的bgr_img上绘制呢?
编辑:
这是到目前为止的代码:
import cv2
import numpy as np
img = cv2.imread("white_foo.jpg") #1000x1000 pixel
#lets say these are my black pixels in a white image.
x = np.array([122, 224, 210, 350, 380, 250, 490, 623, 711, 819, 900])
y = np.array([536, 480, 390, 366, 270, 240, 180, 210, 280, 400, 501])
#calculate the coefficients.
z = np.polyfit(x, y, 2)
lspace = np.linspace(0, 1000, 100)
#here I want to draw the polynomial which I calculated with polyfit on my image
cv2.imshow("test", img)
cv2.waitKey(0)
预先感谢
答案 0 :(得分:0)
一个快速的谷歌出现了:https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#polylines
这是Opencv polylines function in python throws exception
无论如何,您都需要在感兴趣的点上评估多项式,然后适当格式化这些点(折线希望将它们放在int32容器中,格式为[[x_1, y_1], [x_2, y_2], ... , [x_n, y_n]]
)。然后只需调用该函数即可。
draw_x = lspace
draw_y = np.polyval(z, draw_x) # evaluate the polynomial
draw_points = (np.asarray([draw_x, draw_y]).T).astype(np.int32) # needs to be int32 and transposed
cv2.polylines(img, [draw_points], False, (0,0,0)) # args: image, points, closed, color
答案 1 :(得分:0)
我会通过创建和重用 matplotlib.pyplot 库中的 AxesSubplot 对象来实现。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("white_foo.jpg") #1000x1000 pixel
#lets say these are my black pixels in a white image.
y = np.array([122, 224, 210, 350, 380, 250, 490, 623, 711, 819, 900])
x = np.array([536, 480, 390, 366, 270, 240, 180, 210, 280, 400, 501])
# Initilaize y axis
lspace = np.linspace(0, out_img.shape[0]-1, out_img.shape[0])
#calculate the coefficients.
z = np.polyfit(x, y, 2)
#calculate x axis
line_fitx = z[0]*lspace**2 + z[1]*lspace+ z[2]
# Create axes figure
ax1 = plt.axes()
#Show image
ax1.imshow(out_img, aspect='auto')
#Draw Polynomial over image
ax1.plot(line_fitx,lspace, color='blue');
另一种方法是创建一个与图像形状相同的白色图像(二维 NumPy 零数组),并使用绘图位置作为索引为像素提供颜色。见下文
verts = np.array(list(zip(lspace.astype(int),line_fitx.astype(int))))
polynom_image[tuple(verts.T)] = [255,0,0]
# Create axes figure
ax2 = plt.axes()
#Show image
ax2.imshow(polynom_image)
然后可以使用 cv2.addWeighted
函数将它们合并为一个图像。
result = cv2.addWeighted(polynom_image, 1, und_images[0], 0.5, 0)
我看到的第二种方法的缺点是缺乏对情节的控制,尤其是线条宽度。
使用 cv2.polylines
函数。注意是修改了原来的img(numpy数组)。
verts = np.array(list(zip(line_fitx.astype(int),lspace.astype(int))))
cv2.polylines(img,[verts],False,(0,255,255),thickness=3)
ax2 = plt.axes()
ax2.imshow(img)