首页 > 解决方案 > 如何使用 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()

1.png

标签: pythonnumpyopencv

解决方案


您需要对分割后的图像进行模糊处理,然后使用 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 belding 的掩码

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

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

输出图像


推荐阅读