OpenCV Python 如何在将图像转换为灰度时保留一种颜色

问题描述 投票:0回答:2

如何使图像中除橙色锥体之外的所有内容均为灰度。使用 opencv python。

python image numpy opencv image-processing
2个回答
3
投票

您可以通过使用

bitwise_and()
函数和
threshold()
函数来实现您的目标。 步骤:

  • 为所需区域生成
    mask
    。(这里使用
    thresholding
    ,但也可以使用其他方法)
  • 使用
    regions
    (图像和蒙版)提取所需的
    bitwise_and
  • 添加
    masked regions
    以获得输出。

这是示例代码:

import cv2
import numpy as np

img = cv2.imread('input.jpg')

# creating mask using thresholding over `red` channel (use better use histogram to get thresholding value)
# I have used 200 as thresholding value it can be different for different images
ret, mask = cv2.threshold(img[:, :,2], 200, 255, cv2.THRESH_BINARY)

mask3 = np.zeros_like(img)
mask3[:, :, 0] = mask
mask3[:, :, 1] = mask
mask3[:, :, 2] = mask

# extracting `orange` region using `bitewise_and`
orange = cv2.bitwise_and(img, mask3)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img  = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)

# extracting non-orange region
gray = cv2.bitwise_and(img, 255 - mask3)

# orange masked output
out = gray + orange

cv2.imwrite('orange.png', orange)
cv2.imwrite('gray.png', gray)
cv2.imwrite("output.png", out)

结果:

蒙版橙色图像

蒙版灰色图像

输出图像


2
投票

这是在 Python/OpenCV 中执行此操作的另一种方法。

  • 读取输入内容
  • 使用 cv2.inRange() 设置颜色阈值
  • 应用形态学将其清理并作为掩模填充孔
  • 创建输入的灰度版本
  • 通过 np.where() 使用掩码合并输入和灰度版本
  • 保存结果

输入:

import cv2
import numpy as np

img = cv2.imread("orange_cone.jpg")

# threshold on orange
lower = (0,60,200)
upper = (110,160,255)
thresh = cv2.inRange(img, lower, upper)

# apply morphology and make 3 channels as mask
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
mask = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
mask = cv2.merge([mask,mask,mask])

# create 3-channel grayscale version
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)

# blend img with gray using mask
result = np.where(mask==255, img, gray)

# save images
cv2.imwrite('orange_cone_thresh.jpg', thresh)
cv2.imwrite('orange_cone_mask.jpg', mask)
cv2.imwrite('orange_cone_result.jpg', result)

# Display images
cv2.imshow("thresh", thresh)
cv2.imshow("mask", mask)
cv2.imshow("result", result)
cv2.waitKey(0)

阈值图像:

遮罩图像:

合并结果:

© www.soinside.com 2019 - 2024. All rights reserved.