当前位置: 首页 > 知识库问答 >
问题:

如何在Python中遮罩外部或内部任意形状?

卜和悌
2023-03-14
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()

我想在图像中形成任意闭合曲线后,变换外部或内部区域的像素值。我该怎么做?

共有2个答案

澹台志诚
2023-03-14

这里有另一种使用cv2.drawContour()的方法。这个想法是把你粗糙的轮廓点,平滑它们,把这个轮廓画在蒙版上,然后cv2.bitwise_and()或按位反-并提取所需的区域。

输入图像<代码>-

结果<代码>-

import numpy as np
import cv2
from scipy import interpolate

# Load image, make blank mask, define rough contour points
image = cv2.imread('1.jpg')
mask = np.zeros(image.shape, dtype=np.uint8) 
x = np.array([192, 225, 531, 900, 500])
y = np.array([154, 281, 665, 821, 37])
x = np.r_[x, x[0]]
y = np.r_[y, y[0]]

# Smooth contours
tck, u = interpolate.splprep([x, y], s=0, per=True)
x_new, y_new = interpolate.splev(np.linspace(0, 1, 1000), tck)
smooth_contour = np.array([[[int(i[0]), int(i[1])]] for i in zip(x_new, y_new)])

# Draw contour onto blank mask in white
cv2.drawContours(mask, [smooth_contour], 0, (255,255,255), -1)
result1 = cv2.bitwise_and(image, mask)
result2 = cv2.bitwise_and(image, 255 - mask)

cv2.imshow('image', image)
cv2.imshow('mask', mask)
cv2.imshow('result1', result1)
cv2.imshow('result2', result2)
cv2.waitKey()
薛烈
2023-03-14

您可以使用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()

现在掩蔽可以使用:

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)

使用倒置蒙版,您可以随心所欲地操作外部像素:

mask    = np.ones_like(img)*255
cv2.fillPoly(mask, pts=[contour], color=(0,0,0))
masked_img = cv2.bitwise_and(img, mask)

这导致:

 类似资料:
  • 问题内容: 我尝试安装此软件。为此,需要Python。 我从这里name安装了Python 。 我正在Windows 7上工作。 之后,我做 当我运行任何Python文件时,它显示 python无法识别为内部或外部命令,可操作程序或批处理文件。无法创建vc项目文件。 我该如何解决? 问题答案: 您要追加到字符串,而不是scripts文件夹。基本上,您希望路径上带有实际二进制文件的文件夹。

  • 问题内容: 我尝试安装该软件。为此,需要Python。 我从这里 name 安装了Python 。 我正在Windows 7上工作。 我的Python软件的层次结构与此博文相同。 之后,我做 当我运行任何Python文件时,它显示 python无法识别为内部或外部命令,可操作程序或批处理文件。无法创建vc项目文件。 我该如何解决? 问题答案: 您要追加到字符串,而不是scripts文件夹。基本上,

  • 定义 用于弹层等需要遮挡底部内容。 图片展示 代码演示 import Mask from 'pile/dist/components/mask' <Mask transparent={true} /> 属性 参数 描述 数据类型 默认值 transparent 是否透明(true:是,false:否) bool false hidden 是否隐藏(true:是,false:否) bool

  • 本文向大家介绍在8085中需要遮罩,包括了在8085中需要遮罩的使用技巧和注意事项,需要的朋友参考一下  假设8085由于RST6.5引脚而中断,并且已经分支到ISS的RST6.5引脚。然后,除了此ISS开头的DI指令外,除TRAP之外的所有中断均被禁止。因此,即使在执行RST6.5 ISS的过程中RST7.5引脚处于激活状态,也不会由于RST7.5而发生8085中断。实际上,较高优先级的中断是R

  • 当jenkins试图构建我的程序时,jenkins构建失败,错误不被识别为内部或外部命令。以下是詹金斯的运作: 谢谢,问候

  • 问题内容: 我在尝试在计算机上安装时遇到了一个奇怪的错误。 这是我在命令行中键入的序列: 是什么原因造成的? 编辑 根据要求,这是我输入时得到的结果 问题答案: 您需要将pip安装的路径添加到PATH系统变量中。默认情况下,pip已安装(pip现在与新版本的python捆绑在一起),因此需要将路径“ 添加到PATH变量中。 要检查它是否已经在PATH变量中,请在CMD提示符下键入 要将pip安装的