有什么想法吗?
2 个评论
改变/读取图像为HSV颜色空间阵列,只操作棕色色带的颜色(色调)。
你也可以使用 inRange 函数,根据你的颜色范围提取一个掩码,然后用掩码来改变图像中的像素值。
python
opencv
image-processing
colors
python-imaging-library
George Tanev
George Tanev
发布于 2018-05-07
2 个回答
Mark Setchell
Mark Setchell
发布于 2022-05-08
已采纳
0 人赞同

这应该给你一个概念--它是相当好的评论。

#!/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)

How did I determine the limits for "brown"?我在图像中找到了一个棕色的区域,并把它裁剪出来,以去除其他的东西。然后我将其调整为1x1,以平均该区域的所有棕色色调,并将其转换为HSV色彩空间,我将其打印出来,并取Hue的值为15,然后进行+/-5,得到一个10-20的范围。将这个范围增加到8-22,以选择更广泛的色调范围。

维基百科上对HSV/HSL色彩空间进行了描述here.

Keywords:图像处理、Python、OpenCV、inRange、颜色范围、素色。

aph
我有个问题, brown_hi brown_lo 是指BGR RGB或HSV
@aph 它们都是HSV。你可以知道,因为我对HSV图像应用了 cv.inRange()
Jeru Luke
Jeru Luke
发布于 2022-05-08
0 人赞同

我想提出一个不同的方法。然而,这只对某些主导颜色(红、蓝、绿、蓝)的范围有效。我的重点是有关图像中存在的红色区域。

在这里,我使用的是 LAB色彩空间 where:

  • L-channel: expresses the brightness in the image
  • A-channel: expresses variation of color in the image between red and green
  • B-channel: expresses variation of color in the image between yellow and blue
  • 由于我对 red 区域,我将选择A通道进行进一步处理。

    Code:

    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)
    

    下面是这两张图片叠放在一起的情况。