Python绘图:如何为Blob矫正后的图形添加1px白色边框?
解决添加1px白色边框的问题
嘿,这事儿好办!要给矫正后的黑色Blob和背景之间加1px白色边框,我们可以利用双层绘图的思路:先画一层稍粗的白色线条作为边框基底,再在它上面画黑色的Blob线条,这样白色线条就会在黑色周围自然露出1px的边框效果。
下面是修改后的完整代码,重点看straighten_up函数里的绘图逻辑:
import numpy as np import matplotlib.pyplot as plt import cv2 img = cv2.imread('input_image.png', 0) # 修正参数:100改为0(灰度模式,符合边缘检测需求) edges = cv2.Canny(img, 0, 255) # 提取Blob边缘 # 计算Blob方向的代码保持不变 img = edges y, x = np.nonzero(img) x = x - np.mean(x) y = y - np.mean(y) coords = np.vstack([x, y]) cov = np.cov(coords) evals, evecs = np.linalg.eig(cov) sort_indices = np.argsort(evals)[::-1] x_v1, y_v1 = evecs[:, sort_indices[0]] x_v2, y_v2 = evecs[:, sort_indices[1]] scale = 30 plt.plot([x_v1*-scale*2, x_v1*scale*2], [y_v1*-scale*2, y_v1*scale*2], color='red') plt.plot([x_v2*-scale, x_v2*scale], [y_v2*-scale, y_v2*scale], color='blue') plt.plot(x, y, 'k.') plt.axis('equal') plt.gca().invert_yaxis() plt.show() def straighten_up(x_v1, y_v1, coords): theta = np.arctan((x_v1)/(y_v1)) rotation_mat = np.matrix([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]]) transformed_mat = rotation_mat * coords x_transformed, y_transformed = transformed_mat.A fig, ax = plt.subplots(nrows=1, ncols=1) ax.set_facecolor((1.0, 0.47, 0.42)) # 第一步:绘制白色边框(线宽设为3) plt.plot(x_transformed, y_transformed, color='white', linewidth=3) # 第二步:绘制黑色Blob(线宽设为1),覆盖在白色边框中间,露出1px白边 plt.plot(x_transformed, y_transformed, color='black', linewidth=1) plt.axis('equal') plt.gca().invert_yaxis() # 和第一个图保持一致的y轴方向,避免视觉混乱 straighten_up(x_v1, y_v1, coords) plt.show()
关键修改说明:
- 修正了
cv2.imread的参数:你原来写的100是无效值,换成0才能正确读取灰度图像,适配Canny边缘检测。 - 双层绘图逻辑:
- 白色线条用
linewidth=3作为基底,黑色线条用linewidth=1覆盖在中间,这样白色会在黑色四周各露出1px的边框(3px-1px=2px,均分在两侧)。
- 白色线条用
- 补充了坐标系对齐:加上
plt.axis('equal')和plt.gca().invert_yaxis(),让矫正后的图和第一个方向分析图的坐标系保持一致,更直观。
如果你的Blob是散点而非连续线条,也可以用scatter实现边框:
# 散点版的边框实现 plt.scatter(x_transformed, y_transformed, color='black', edgecolor='white', linewidths=1)
内容的提问来源于stack exchange,提问作者NN28
相关产品推荐
相关产品推荐

