python-3.x - 将热图应用于 opencv 矩形
问题描述
我正在尝试在我图片的选定部分[人脸]上应用热图。这是我到目前为止所做的......矩形将应用于面部。人脸将被裁剪 热图将应用于裁剪后的图像。
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
crop_img = image[y:y+h, x:x+w]
# Cropping Area
# Color Mapping Area
images = cv2.imread(crop_img, 0)
colormap = plt.get_cmap('inferno')
heatmap = (colormap(images) * 2**16).astype(np.uint16)[:,:,:3]
heatmap = cv2.cvtColor(heatmap, cv2.COLOR_RGB2BGR)
# Saving Color Map
img_names = "heatimage{}.png".format(i)
cv2.imwrite(img_names, heatmap)
print("{} written!".format(img_names))
img = cv2.imread(img_names,0)
cv2.imshow('heatmap{}'.format(i),heatmap)
我能够分别保存裁剪的图像和矩形指向面,但我需要 1. 在我的原始图像中使矩形成为热图,而无需单独裁剪。2.图像的其他部分必须正常
已编辑
在脸部周围画一个矩形
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
crop_img = image[y:y+h, x:x+w]
sample = cv2.imread("sample.jpg",cv2.COLOR_BGR2GRAY)
colormap = cm.get_cmap('inferno', 256)
cmp = cm.ScalarMappable(cmap='inferno')
# create 1D float gradient from 0 to 1 with 256 increments
# convert to rgba in range 0 to 255 (via bytes=True)
# remove alpha channel and reshape to 256x1 3 channel from (256, 4)
# convert rgb to bgr
cmap = np.linspace(0, 1, 256, endpoint=True)
cmap = cmp.to_rgba(cmap, bytes=True)
cmap = cmap[:, 0:-1].reshape((256, 1, 3))
cmap = cv2.cvtColor(cmap, cv2.COLOR_RGB2BGR)
# apply color map to crop
crop_mapped = cv2.applyColorMap(crop_img, cmap)
# put color mapped crop back into input
result = sample.copy()
result = cv2.cvtColor(result, cv2.COLOR_GRAY2BGR)
result[y:y+h, x:x+w] = crop_mapped
# save result
cv2.imwrite('IRimage.jpg', result)
# show result
cv2.imshow("result", result)
i+=1
cv2.imshow("Faces found", image)
如果我有不止一张脸,我如何在两张脸上都应用彩色滤镜?
解决方案
我相信您将不得不裁剪图像,将颜色图应用于裁剪后的图像,然后将颜色映射的裁剪图像放回原始图像。我认为没有办法将颜色图直接应用于图像的一部分。
这是我在 Python/OpenCV 中执行上述操作的方法。
- 将输入读取为灰度
- 裁剪您想要颜色映射的图像
- 从 Matplotlib 加载颜色图并将其转换为 BGR 图像
- 将颜色图应用于裁剪的图像
- 将输入转换为 3 通道灰度并将颜色映射的裁剪图像插入正确的位置。
- 保存结果
输入:
import cv2
import numpy as np
import matplotlib.cm as cm
# read image and convert to gray
img = cv2.imread('redhat_gray.jpg', cv2.COLOR_BGR2GRAY)
# crop image
crop = img[140:240, 70:170]
# get colormap from matplotlib and normalize
colormap = cm.get_cmap('inferno', 256)
cmp = cm.ScalarMappable(cmap='inferno')
# create 1D float gradient from 0 to 1 with 256 increments
# convert to rgba in range 0 to 255 (via bytes=True)
# remove alpha channel and reshape to 256x1 3 channel from (256, 4)
# convert rgb to bgr
cmap = np.linspace(0, 1, 256, endpoint=True)
cmap = cmp.to_rgba(cmap, bytes=True)
cmap = cmap[:, 0:-1].reshape((256, 1, 3))
cmap = cv2.cvtColor(cmap, cv2.COLOR_RGB2BGR)
#print(cmap)
# apply color map to crop
crop_mapped = cv2.applyColorMap(crop, cmap)
# put color mapped crop back into input
result = img.copy()
result = cv2.cvtColor(result, cv2.COLOR_GRAY2BGR)
result[140:240, 70:170] = crop_mapped
# save result
cv2.imwrite('redhat_gray_rectangle_inferno.jpg', result)
# show result
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
推荐阅读
- vba - 将表单字段设置为自动填充文本、日期和组合框的先前记录条目
- python - Android Kivy Python上的TextInput键盘问题
- swift - 根据代码库 Swift 中 NSLocalizedString 的出现生成 Localizable.strings 文件
- javascript - 为什么 node-lame 不能正确编码(nodeJS 库)?
- linux - 我无法从 PhpStorm 保存到 WSL2
- c++ - 如何跟踪 C/C++ 程序的调用函数和执行语句?
- crm - Zoho CRM 移动应用程序上的通话录音和通话记录
- python - / 'NoneType' 对象的 AttributeError 没有属性 '_get_qnames_to_try'
- laravel - Laravel 路由中间件除了路由配置还能用在哪里?
- javascript - 使用地图功能上的 onclick 切换打开和关闭