python - 在python中使用opencv更改图像中区域的颜色

标签 python image opencv

我有一张图片,我想将所有白色像素更改为灰色,但仅限于图像的某个区域。示例图片,我只想更改红色矩形外的图片,而不更改红色矩形内的图像:
Image
我已经有了通用代码,它是别人 Stackoverflow 问题的一部分,它改变了每个白色像素的颜色,而不仅仅是区域外的一个。

image = cv.imread("meme 2.jpg")
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)

# Define lower and uppper limits of what we call "white-ish"
sensitivity = 19
lower_white = np.array([0, 0, 255 - sensitivity])
upper_white = np.array([255, sensitivity, 255])

# Mask image to only select white
mask = cv.inRange(hsv, lower_white, upper_white)

# Change image to grey where we found brown
image[mask > 0] = (170, 170, 170)
cv.imwrite(file, image)

最佳答案

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

  • 读取输入
  • 转换为 HSV 色彩空间
  • 制作蒙版所需颜色的阈值
  • 使用 mask 更改图像中所有对应像素的颜色
  • 为不想更改的区域绘制一个新的矩形蒙版
  • 反转您想要更改的区域的新掩码
  • 将新蒙版应用于原始图像
  • 将反转的新蒙版应用于颜色更改的图像
  • 将两个结果加在一起形成最终图像
  • 保存结果

  • 输入:

    enter image description here
    import cv2
    import numpy as np
    
    # Read image
    image = cv2.imread('4animals.jpg')
    
    # Convert to HSV
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    # Define lower and uppper limits of what we call "white-ish"
    sensitivity = 19
    lower_white = np.array([0, 0, 255 - sensitivity])
    upper_white = np.array([255, sensitivity, 255])
    
    # Create mask to only select white
    mask = cv2.inRange(hsv, lower_white, upper_white)
    
    # Change image to grey where we found white
    image2 = image.copy()
    image2[mask > 0] = (170, 170, 170)
    
    # Create new rectangular mask that is white on black background
    x,y,w,h = 33,100,430,550
    mask2 = np.zeros_like(image)
    cv2.rectangle(mask2, (x,y), (x+w,y+h), (255, 255, 255), -1)
    
    # invert mask
    mask2_inv = 255 - mask2
    
    # apply mask to image
    image_masked = cv2.bitwise_and(image, mask2)
    
    # apply inverted mask to image2
    image2_masked = cv2.bitwise_and(image2, mask2_inv)
    
    # add together
    result = cv2.add(image_masked, image2_masked)
    
    # save results
    cv2.imwrite('4animals_mask.jpg', mask)
    cv2.imwrite('4animals_modified.png', image2)
    cv2.imwrite('4animals_mask2.jpg', mask2)
    cv2.imwrite('4animals_mask2_inv.jpg', mask2_inv)
    cv2.imwrite('4animals_masked.jpg', image_masked)
    cv2.imwrite('4animals_modified_masked.jpg', image2_masked)
    cv2.imwrite('4animals_result.jpg', result)
    
    cv2.imshow('mask', mask)
    cv2.imshow('image2', image2)
    cv2.imshow('mask2', mask2 )
    cv2.imshow('mask2_inv', mask2_inv)
    cv2.imshow('image_masked', image_masked)
    cv2.imshow('image2_masked', image2_masked)
    cv2.imshow('result', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    颜色面具:

    enter image description here

    矩形 mask :

    enter image description here

    倒矩形 mask :

    enter image description here

    颜色改变的图像:

    enter image description here

    屏蔽输入:

    enter image description here

    蒙版颜色改变的图像:

    enter image description here

    结果:

    enter image description here

    关于python - 在python中使用opencv更改图像中区域的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61979855/

    相关文章:

    java - 凸性缺陷坐标 java android

    python - 如何从 Python 3 的对话框中打开图像文件?

    python - 使用上限和下限向量创建新变量

    python - pd.to_datetime 是我一半的日期与翻转的日期/月份

    java - 创建自定义 BufferedImage

    java - IOException : Can't read input file. 我找不到使用不同路径的解决方案,即使是手动

    image - 使用 openCV 查找图像中的特定框

    python - 启动新的 scrapy 项目时出错

    python - RESTful API 中使用的 Etag 仍然容易受到竞争条件的影响

    Java-如何通过对角扩展像素来调整图像大小