改变 RGB 图像的颜色
Change color in RGB images
我有一张图片(我有 NumPy 和 PIL 格式的图片),我想将 RGB 值 [0.4, 0.4, 0.4]
更改为 [0.54, 0.27, 0.07]
。
通过这样做,我想将道路颜色从灰色更改为棕色:
您可以尝试这种 numpy 方法:
img[np.where(img == (0.4,0.4,0.4))] = (0.54,0.27,0.27)
您加载的图像表示为三维数组。它的形状应该是height, width, color channel
。 IE。如果它只有 RGB 通道(有些可能有 RGBA 等),矩阵属性看起来像 height, width, 3
剩下的和处理普通数组一样。你可以这样看:
pixel = image[height][width][colorchannel]
Quang Hoang 的回答对您的问题有一个简单的解决方案。
我必须同意 Majid Shirazi 关于 的观点。让我们来看看:
idx = np.where(img == (0.4, 0.4, 0.4))
然后,idx
是一个 3 元组,每个 ndarray
用于所有 x
-坐标、y
-坐标和 "channel"-坐标。从 NumPy 的 indexing,我看不到使用建议的命令以所需方式正确 access/manipulate img
中的值的可能性。我宁愿重现评论中所述的确切错误。
为了获得合适的 integer array indexing, the x
- and y
-coordinates need to be extracted. The following code will show that. Alternatively, boolean array indexing 也可以使用。我将其添加为附加组件:
import cv2
import numpy as np
# Some artificial image
img = np.swapaxes(np.tile(np.linspace(0, 1, 201), 603).reshape((201, 3, 201)), 1, 2)
cv2.imshow('before', img)
# Proposed solution
img1 = img.copy()
idx = np.where(img1 == (0.4, 0.4, 0.4))
try:
img1[idx] = (0.54, 0.27, 0.27)
except ValueError as e:
print(e)
# Corrected solution for proper integer array indexing: Extract x and y coordinates
img1[idx[0], idx[1]] = (0.54, 0.27, 0.27)
cv2.imshow('after: corrected solution', img1)
# Alternative solution using boolean array indexing
img2 = img.copy()
img2[np.all(img2 == (0.4, 0.4, 0.4), axis=2), :] = (0.54, 0.27, 0.27)
cv2.imshow('after: alternative solution', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
希望有所帮助和澄清!
我有一张图片(我有 NumPy 和 PIL 格式的图片),我想将 RGB 值 [0.4, 0.4, 0.4]
更改为 [0.54, 0.27, 0.07]
。
通过这样做,我想将道路颜色从灰色更改为棕色:
您可以尝试这种 numpy 方法:
img[np.where(img == (0.4,0.4,0.4))] = (0.54,0.27,0.27)
您加载的图像表示为三维数组。它的形状应该是height, width, color channel
。 IE。如果它只有 RGB 通道(有些可能有 RGBA 等),矩阵属性看起来像 height, width, 3
剩下的和处理普通数组一样。你可以这样看:
pixel = image[height][width][colorchannel]
Quang Hoang 的回答对您的问题有一个简单的解决方案。
我必须同意 Majid Shirazi 关于
idx = np.where(img == (0.4, 0.4, 0.4))
然后,idx
是一个 3 元组,每个 ndarray
用于所有 x
-坐标、y
-坐标和 "channel"-坐标。从 NumPy 的 indexing,我看不到使用建议的命令以所需方式正确 access/manipulate img
中的值的可能性。我宁愿重现评论中所述的确切错误。
为了获得合适的 integer array indexing, the x
- and y
-coordinates need to be extracted. The following code will show that. Alternatively, boolean array indexing 也可以使用。我将其添加为附加组件:
import cv2
import numpy as np
# Some artificial image
img = np.swapaxes(np.tile(np.linspace(0, 1, 201), 603).reshape((201, 3, 201)), 1, 2)
cv2.imshow('before', img)
# Proposed solution
img1 = img.copy()
idx = np.where(img1 == (0.4, 0.4, 0.4))
try:
img1[idx] = (0.54, 0.27, 0.27)
except ValueError as e:
print(e)
# Corrected solution for proper integer array indexing: Extract x and y coordinates
img1[idx[0], idx[1]] = (0.54, 0.27, 0.27)
cv2.imshow('after: corrected solution', img1)
# Alternative solution using boolean array indexing
img2 = img.copy()
img2[np.all(img2 == (0.4, 0.4, 0.4), axis=2), :] = (0.54, 0.27, 0.27)
cv2.imshow('after: alternative solution', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
希望有所帮助和澄清!