首页 > 解决方案 > 将热图应用于 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-3.xopencvimage-processingdata-sciencedata-segment

解决方案


我相信您将不得不裁剪图像,将颜色图应用于裁剪后的图像,然后将颜色映射的裁剪图像放回原始图像。我认为没有办法将颜色图直接应用于图像的一部分。

这是我在 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()


结果:

在此处输入图像描述


推荐阅读