如何在OpenCV中用另一个RGB值替换某个RGB值的所有像素

Gam*_*000 6 python opencv image pixel colors

我需要能够在 OpenCV 中用另一种颜色替换具有特定 RGB 值的所有像素。

我尝试了一些解决方案,但没有一个对我有用。

实现这一目标的最佳方法是什么?

Mar*_*ell 10

TLDR;使用 Numpy 将所有绿色像素变为白色:

import numpy as np

pixels[np.all(pixels == (0, 255, 0), axis=-1)] = (255,255,255)
Run Code Online (Sandbox Code Playgroud)

我在这里做了一些其他改变颜色方法的例子。首先,我将使用此图像介绍您在问题中提出的准确、特定的 RGB 值。它的左侧有三个大块,分别是红色、绿色和蓝色,右侧是这些颜色之间的三个渐变:

在此处输入图片说明

这是上面的初始答案:

#!/usr/bin/env python3

import cv2
import numpy as np

# Load image
im = cv2.imread('image.png')

# Make all perfectly green pixels white
im[np.all(im == (0, 255, 0), axis=-1)] = (255,255,255)

# Save result
cv2.imwrite('result1.png',im)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


这次我定义了颜色名称以提高可读性和可维护性。最后一行是重点:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make all perfectly green pixels white
im[np.all(im == green, axis=-1)] = white
Run Code Online (Sandbox Code Playgroud)

结果一样。


这次我制作了一个可重复使用的红色像素蒙版,我可以在后续操作中使用它。作业的最后一行im[Rmask] = black现在特别容易阅读:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make mask of all perfectly red pixels
Rmask = np.all(im == red, axis=-1)

# Make all red pixels black
im[Rmask] = black
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


这次我结合了红色和蓝色像素的遮罩,这样您就可以看到遮罩的力量。最后一行是重点:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make mask of all perfectly red pixels and all perfectly blue pixels
Rmask = np.all(im == red,  axis=-1)
Bmask = np.all(im == blue, axis=-1)

# Make all red or blue pixels black
im[Rmask | Bmask] = black
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


这一次,我将所有非红色像素都变成了黑色——希望你现在正在欣赏面具的力量。最后一行是重点:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make mask of all perfectly red pixels
Rmask = np.all(im == red,  axis=-1)

# Make all non-red pixels black
im[~Rmask] = black
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


到目前为止,我们只将一些像素选择为一种新颜色。如果我们想在一次传递中将某些像素设为一种颜色而所有其他像素设为不同颜色怎么办?最后一行是重点:

# Define some colours for readability - these are in OpenCV **BGR** order - reverse them for PIL
red   = [0,0,255]
green = [0,255,0]
blue  = [255,0,0]
white = [255,255,255]
black = [0,0,0]

# Make mask of all perfectly red pixels
Rmask = np.all(im == red,  axis=-1)

# Make all red pixels white AND at same time everything else black
im = np.where(np.all(im == red, axis=-1, keepdims=True), white, black)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


如果您想影响整个颜色范围,而不是特定的 RGB 值,请查看此处此处

关键词:图像处理,Python,素数,改变颜色,改变颜色,素数。