我想为黑白图像添加颜色,我认为更改像素的值应该可以。
for rows in rgb:
for e in rows:
for i in range(len(e)):
max_val = e.max()
min_val = e.min()
if e[i] == max_val:
e[i] * 2.5
if e[i] == min_val:
e[i] * 0.75
else:
e[i] * 1.5
该代码不会返回错误,但也不会更改值。我希望数字被同一数组相乘并重新分配
答案 0 :(得分:0)
我们可以手动使用Numpy的broadcasting功能,而不必手动遍历运行效率低的O(n^3)
的每个像素。
我们首先使用cv2.split()
将灰度图像分成单独的BGR
个通道。这将为我们提供单独的B
,G
和R
通道,每个通道都具有相同的值。接下来,我们使用np.multiply()
将每个通道与标量值相乘。最后,我们使用cv2.merge()
将每个通道合并为彩色图像,以创建单个多通道阵列
之前
>>> print(before.shape)
(331, 500, 3)
您可能想知道为什么图像尽管明显是灰度的却具有三个通道。嗯,是因为每个频道都有相同的值,范围从[0 ... 255]
之后
>>> print(after.shape)
(331, 500, 3)
同样,频道数相同,但是我们修改了每个频道
TLDR:要为黑白图像添加颜色,我们必须提取每个单独的BGR
通道,修改每个通道,然后重建图像
import cv2
import numpy as np
before = cv2.imread('2.png')
b, g, r = cv2.split(before)
np.multiply(b, 1.5, out=b, casting="unsafe")
np.multiply(g, .75, out=g, casting="unsafe")
np.multiply(r, 1.25, out=r, casting="unsafe")
after = cv2.merge([b, g, r])
cv2.imshow('before', before)
cv2.imshow('after', after)
cv2.waitKey()
答案 1 :(得分:0)
这是将渐变颜色应用于灰度图像的一种方法。
Load the grayscale image
Convert it to 3 equal channels
Create a 1 pixel red image
Create a 1 pixel blue image
Concatenate the two
Resize linearly to 256 pixels as a Lookup Table (LUT)
Apply the LUT
输入:
import cv2
import numpy as np
# load image as grayscale
img = cv2.imread('lena_gray.png', cv2.IMREAD_GRAYSCALE)
# convert to 3 equal channels
img = cv2.merge((img, img, img))
# create 1 pixel red image
red = np.zeros((1, 1, 3), np.uint8)
red[:] = (0,0,255)
# create 1 pixel blue image
blue = np.zeros((1, 1, 3), np.uint8)
blue[:] = (255,0,0)
# append the two images
lut = np.concatenate((red, blue), axis=0)
# resize lut to 256 values
lut = cv2.resize(lut, (1,256), interpolation=cv2.INTER_CUBIC)
# apply lut
result = cv2.LUT(img, lut)
# save result
cv2.imwrite('lena_red_blue_lut_mapped.png', result)
# display result
cv2.imshow('RESULT', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果需要,可以将要形成彩虹LUT的许多不同颜色的像素串联起来。