soo*_*ong 8 python opencv image-processing computer-vision python-imaging-library
from scipy import interpolate
import matplotlib.pyplot as plt
import numpy as np
import cv2
a=np.arange(1,9)
filename = 'image_file_0.tiff'
img = cv2.imread(filename)
x = np.array([389, 392, 325, 211, 92,103,194,310])
y = np.array([184,281,365,401,333,188,127,126])
x = np.r_[x, x[0]]
y = np.r_[y, y[0]]
tck, u = interpolate.splprep([x, y], s=0, per=True)
xi, yi = interpolate.splev(np.linspace(0, 1, 1000), tck)
fig, ax = plt.subplots(1, 1)
ax.plot(xi, yi, '-b')
plt.imshow(img)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我想在图像中形成任意闭合曲线后变换外部或内部区域的像素值。我该怎么做?
您可以使用该cv2.fillpoly功能来做到这一点。以这张图片为例:
我们可以使用以下方法获得想要遮罩的形状:
from scipy import interpolate
import matplotlib.pyplot as plt
import numpy as np
import cv2
a=np.arange(1,9)
filename = 'image_file_0.tiff'
img = cv2.imread('image_left.png', cv2.IMREAD_COLOR)
x = np.array([289, 292, 125, 111, 40, 80, 94,210])
y = np.array([84 , 181, 265, 241,133, 88, 27, 40])
x = np.r_[x, x[0]]
y = np.r_[y, y[0]]
tck, u = interpolate.splprep([x, y], s=0, per=True)
xi, yi = interpolate.splev(np.linspace(0, 1, 1000), tck)
plt.imshow(img[:,:,[2,1,0]])
plt.scatter(xi, yi)
plt.show()
Run Code Online (Sandbox Code Playgroud)
现在可以使用以下方法完成屏蔽:
contour = np.array([[xii, yii] for xii, yii in zip(xi.astype(int), yi.astype(int))])
mask = np.zeros_like(img)
cv2.fillPoly(mask, pts=[contour], color=(255, 255, 255))
masked_img = cv2.bitwise_and(img, mask)
Run Code Online (Sandbox Code Playgroud)
使用反转蒙版,您可以根据需要操纵外部像素:
mask = np.ones_like(img)*255
cv2.fillPoly(mask, pts=[contour], color=(0,0,0))
masked_img = cv2.bitwise_and(img, mask)
Run Code Online (Sandbox Code Playgroud)
这导致:
| 归档时间: |
|
| 查看次数: |
3212 次 |
| 最近记录: |