繁体   English   中英

如何使用 python opencv 模糊图像中的红色,使其不清晰可见?

[英]How to blur red color in image with python opencv so that its not clearly visible?

我想模糊图像中的红色(附有“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()

1.png

您需要对分割后的图像进行模糊处理,然后使用 alpha 混合将模糊后的 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 kernel 来模糊图像:

blur = cv2.blur(color_only, (13,13))
cv2.imshow('blur', blur)

模糊的图像

接下来,模糊分割图像的掩码。 稍后我们将使用它来组合图像。 使用按位 function 很容易组合图像,但这种方法在这里不起作用,因为模糊图像不再占据与分割图像相同的空间:

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 belnding 掩码

最后可以使用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)

请注意红线是如何模糊的,但绿色和白色边框不是:

输出图像

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM