簡體   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