python - 如何使用 python opencv 模糊图像中的红色,使其不清晰可见?
问题描述
我想模糊图像中的红色(附加了“1.png”),使其不清晰可见。我尝试了下面的代码,我可以将红色更改为黑色,但我怎样才能模糊它?请帮忙。
import cv2
import numpy as np
frame = cv2.imread("1.png")
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# define range of red color in HSV
lower = np.array([0,50,50])
upper = np.array([10,255,255])
# define range of blue color in HSV
# lower = np.array([38, 86, 0])
# upper = np.array([121, 255, 255])
# define range of pink color in HSV
# http://www.workwithcolor.com/pink-color-hue-range-01.htm
# lower = np.array([158, 127, 0])
# upper = np.array([179, 255, 255])
# Threshold the HSV image to get only red colors
mask = cv2.inRange(hsv, lower, upper)
color_only = cv2.bitwise_and(frame, frame, mask = mask)
# convert mask to 3-channel image to perform subtract
mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
res = cv2.subtract(frame, mask) #negative values become 0 -> black
cv2.imshow("frame", frame)
# cv2.imshow("mask", mask)
# cv2.imshow("color_only", color_only)
cv2.imshow("res", res)
cv2.waitKey()
cv2.destroyAllWindows()
解决方案
您需要对分割后的图像进行模糊处理,然后使用 alpha blending 将模糊的 ROI 与背景图像合成。此代码将带您完成所有步骤:
读取图像并分割感兴趣的颜色:
import cv2
import numpy as np
frame = cv2.imread("/home/stephen/Desktop/1.png")
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# define range of red color in HSV
lower = np.array([0,50,50])
upper = np.array([10,255,255])
mask = cv2.inRange(hsv, lower, upper)
color_only = cv2.bitwise_and(frame, frame, mask = mask)
### THE BACKGROUND MUST BE MADE WHITE, NOT BLACK ###
color_only[np.where((color_only==[0,0,0]).all(axis=2))] = [255,255,255]
cv2.imshow("color_only", color_only)
接下来,模糊分割的图像。注意,我使用的是 13,13 内核来模糊图像:
blur = cv2.blur(color_only, (13,13))
cv2.imshow('blur', blur)
接下来,模糊分割图像的蒙版。稍后我们将使用它来组合图像。使用按位函数组合图像很容易,但这种方法在这里不起作用,因为模糊图像不再占据与分割图像相同的空间:
maskForAlphaBlending = blur
## BLACK OUT THE WHITE BACKGROUND OF THE ALPHA MASK
maskForAlphaBlending[np.where((maskForAlphaBlending==[255,255,255]).all(axis=2))] = [0,0,0]
maskForAlphaBlending = cv2.cvtColor(maskForAlphaBlending, cv2.COLOR_BGR2GRAY)
cv2.imshow('maskForAlphaBlending', maskForAlphaBlending)
最后可以使用alpha blending来合成模糊的分割图像和绿色和白色背景图像:
foreground = blur
background = frame
alpha = cv2.cvtColor(maskForAlphaBlending, cv2.COLOR_GRAY2BGR)
foreground = foreground.astype(float)
background = background.astype(float)
alpha = alpha.astype(float)/100
foreground = cv2.multiply(alpha, foreground)
background = cv2.multiply(1.0 - alpha, background)
outImage = cv2.add(foreground, background)
cv2.imshow("outImg", outImage/255)
注意红线是如何模糊的,但绿色和白色的边界不是:
推荐阅读
- python - 在 Visual Studio Code 中调试返回 [Errno 2] No such file or directory,但是从 cmd 运行时工作正常
- azure - 添加物联网设备时无法创建对称密钥
- angular - 我可以创建一个有角度的库,但这取决于另一个 NPM 本地库
- java - 当我按下手机的后退按钮时,应用程序关闭
- javascript - req.body.Dates 未定义
- bokeh - 更改 Bokeh 表行数
- rust - 在静态函数中使用 FnMut() 闭包
- python - 如何在此函数中定义数字变量?
- html - 如何在此 HTML 电子邮件模板中调整图像?
- node.js - NPM 跨脚本持久化环境变量