使用 OpenCV 将一定范围内的颜色更改为另一种颜色
- 2025-03-05 09:14:00
- admin 原创
- 102
问题描述:
我想将棕色区域更改为红色(或其他颜色)。只是我不知道如何获取棕色的范围并将它们放入 Python 代码中。我知道如何更改单一颜色,但不知道如何更改一系列颜色。有什么想法吗?谢谢
解决方案 1:
这应该能给你一个想法——它的评论很好:
#!/usr/local/bin/python3
import cv2 as cv
import numpy as np
# Load the aerial image and convert to HSV colourspace
image = cv.imread("aerial.png")
hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
# Define lower and uppper limits of what we call "brown"
brown_lo=np.array([10,0,0])
brown_hi=np.array([20,255,255])
# Mask image to only select browns
mask=cv.inRange(hsv,brown_lo,brown_hi)
# Change image to red where we found brown
image[mask>0]=(0,0,255)
cv.imwrite("result.png",image)
我如何确定“棕色”的极限?我在图像中找到一个棕色区域,然后裁剪掉它以删除其他所有内容。然后我将其调整为 1x1 以平均该区域内的所有棕色色调,并将其转换为 HSV 颜色空间,我将其打印出来并取值Hue
为 15,然后取 +/-5 以得到 10-20 的范围。将范围增加到 8-22 以选择更广泛的色调范围。
HSV/HSL 色彩空间在维基百科上有描述。
关键词:图像处理、Python、OpenCV、inRange、颜色范围、素数。
解决方案 2:
我想提出一种不同的方法。但是,这种方法只适用于某些主色(红色、蓝色、绿色和蓝色)。我关注的是所讨论图像中的红色区域。
背景:
这里我使用LAB 颜色空间:
L通道:表示图像中的亮度
A通道:表示图像中红色和绿色之间的颜色变化
B通道:表达图像中黄色和蓝色之间的颜色变化
由于我对红色区域感兴趣,因此我将选择 A 通道进行进一步处理。
代码:
img = cv2.imread('image_path')
# convert to LAB color space
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# A-channel
cv2.imshow('A-channel', lab[:,:,1])
如果仔细观察图片,明亮的区域与原始图片中的红色相对应。现在,当我们对其进行阈值处理时,我们可以将其完全隔离:
th = cv2.threshold(lab[:,:,1],127,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
使用th
图像作为蒙版,我们为相应区域赋予不同的白色:
# create copy of original image
img1=img.copy()
# highlight white region with different color
img1[th==255]=(255,255,0)
以下是两张堆叠在一起的图像:
您可以规范化 A 通道图像以更好地进行可视化:
dst = cv2.normalize(lab[:,:,1], dst=None, alpha=0, beta=255,norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
这样,处理主色时就无需在 HSV 空间中寻找范围。探索 B 通道可以帮助隔离蓝色和黄色区域。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD