如何通过opencv使用带有像素计算、灰度值的自定义颜色图,并使其在相机上可用



我试图在论文中实现mcolor颜色图见第8至10页。

我开发了处理图像文件的代码,它运行良好。现在,我想对opencv拍摄的相机采用这种图像处理方法。我用python和opencv实现了它。由于计算的限制,它看起来是不可行的。有人能告诉我改进的方向吗?我期望将我的图像处理算法应用于相机的所有帧。非常感谢。以下是我完整的python 源代码

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_new = np.ones([img.shape[0], img.shape[1], 3], np.uint8)
mcolor = np.ones([img.shape[0], img.shape[1], 3], np.uint8)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
val = img_gray[i][j] % 36
if img_gray[i][j] <= 72:
if val >= 1 and val <= 6:
mcolor[i][j] = (0, 0, 35)
elif val >= 7 and val <= 12:
mcolor[i][j] = (i * 10, 0, 0)
elif val >= 13 and val <= 18:
mcolor[i][j] = (1, 0, 35)
elif val >= 19 and val <= 24:
mcolor[i][j] = (i * 20, 0, i * 20)
elif val >= 25 and val <= 30:
mcolor[i][j] = (i * 10, i * 5, i * 5)
elif val >= 31 and val <= 36:
mcolor[i][j] = (i * 10, 0, i * 4)
elif img_gray[i][j] >= 73 and img_gray[i][j] <= 240:
if val >= 1 and val <= 6:
mcolor[i][j] = (0, 0, i * 6)
elif val >= 7 and val <= 12:
mcolor[i][j] = (0, i * 6, i * 6)
elif val >= 13 and val <= 18:
mcolor[i][j] = (0, i * 6, 0)
elif val >= 19 and val <= 24:
mcolor[i][j] = (i * 6, i * 6, 0)
elif val >= 25 and val <= 30:
mcolor[i][j] = (i * 6, 0, i * 6)
elif val >= 31 and val <= 36:
mcolor[i][j] = (i * 6, 0, 0)
elif img_gray[i][j] > 241:
if val >= 1 and val <= 6:
mcolor[i][j] = (0, i * 10, 30)
elif val >= 7 and val <= 12:
mcolor[i][j] = (0, i * 10, 30)
elif val >= 13 and val <= 18:
mcolor[i][j] = (0, i * 10, 30)
elif val >= 19 and val <= 24:
mcolor[i][j] = (i * 10, 0, 0)
elif val >= 25 and val <= 30:
mcolor[i][j] = (i * 10, 0, 0)
elif val >= 31 and val <= 36:
mcolor[i][j] = (i * 10, 0, 0)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
b1, g1, r1 = img[i][j]
r2, g2, b2 = mcolor[i][j]
r, g, b = (
min(round((int(r1) + int(r2) + 1) / 1.2), 255),
min(round((int(g1) + int(g2) + 1) / 1.2), 255),
min(round((int(b1) + int(b2) + 1) / 1.2), 255),
)
img_new[i][j] = (r, g, b)
cv2.imshow("live", img_new)
# cv2.imwrite("img_new.jpeg", img_new)
# cv2.waitKey(0)
if cv2.waitKey(1) == ord("q"):
break
cap.release()
cv2.destroyAllWindows()

级联的if非常糟糕,效率非常低(为什么每次都要重新计算模?(并且错误(间隔不连续(。使用输出颜色更好地预计算具有256个(灰度(项的查找表。

https://docs.opencv.org/4.x/d3/d50/group__imgproc__colormap.html

最新更新