Python 3.x 将热贴图应用于opencv矩形

Python 3.x 将热贴图应用于opencv矩形,python-3.x,opencv,image-processing,data-science,data-segment,Python 3.x,Opencv,Image Processing,Data Science,Data Segment,我正在尝试在我的照片的选定部分[人脸]上应用热图。这是我到目前为止所做的。。。 矩形将应用于面。 脸会被剪掉 热图将应用于裁剪的图像 # 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] # Croppin

我正在尝试在我的照片的选定部分[人脸]上应用热图。这是我到目前为止所做的。。。 矩形将应用于面。 脸会被剪掉 热图将应用于裁剪的图像

 # 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.图像的其他部分必须正常

已编辑

围绕面绘制一个矩形
如果我有多张脸,如何对这两张脸应用颜色过滤器?

如果我理解正确,您正在尝试显示一个人脸上的热图部分。试试这个

alpha = 0.5
image[y:y+h, x:x+w] = alpha * image[y:y+h, x:x+w] + (1 - alpha) * heatmap[y:y+h, x:x+w]
cv2.imshow("preview", image)

如果我理解正确,您正在尝试显示一个人脸上的热图部分。试试这个

alpha = 0.5
image[y:y+h, x:x+w] = alpha * image[y:y+h, x:x+w] + (1 - alpha) * heatmap[y:y+h, x:x+w]
cv2.imshow("preview", image)

我相信你将不得不裁剪图像,将彩色贴图应用于裁剪图像,然后将彩色贴图裁剪图像放回原始图像。我不认为有一种方法可以直接将颜色贴图应用于图像的一部分

下面是我如何在Python/OpenCV中执行上述操作的

  • 将输入读取为灰度
  • 裁剪要进行颜色映射的图像
  • 从Matplotlib加载颜色映射并将其转换为BGR图像
  • 将颜色贴图应用于裁剪的图像
  • 将输入转换为3通道灰色,并将彩色贴图裁剪图像插入回正确位置
  • 保存结果

输入:


结果:


我认为您必须裁剪图像,将彩色贴图应用于裁剪图像,然后将彩色贴图裁剪图像放回原始图像中。我不认为有一种方法可以直接将颜色贴图应用于图像的一部分

下面是我如何在Python/OpenCV中执行上述操作的

  • 将输入读取为灰度
  • 裁剪要进行颜色映射的图像
  • 从Matplotlib加载颜色映射并将其转换为BGR图像
  • 将颜色贴图应用于裁剪的图像
  • 将输入转换为3通道灰色,并将彩色贴图裁剪图像插入回正确位置
  • 保存结果

输入:


结果:


如果您发布了热图和要应用热图的图像,这将非常有用。我相信您必须裁剪图像,将彩色贴图应用于裁剪图像,然后将彩色贴图裁剪图像放回原始图像中。我不认为有一种方法可以将彩色贴图应用于图像的一部分,而无需对整个图像进行裁剪或彩色贴图,然后将其与原始图像相结合。如果您发布热图和要应用热图的图像,我相信您必须裁剪图像,将彩色贴图应用于裁剪后的图像,然后将颜色映射的裁剪图像放回原始图像中。我不认为有一种方法可以对图像的一部分应用颜色贴图,而无需对整个图像进行裁剪或颜色贴图,然后将其与原始图像组合。如果我有多张脸,如何对两张脸应用颜色过滤器?进行多个裁剪,然后在对其应用热图后重新插入。或者将热图应用于完整图像,然后从要应用热图的所有区域制作遮罩。然后使用遮罩组合原始图像和彩色图像,以便热图显示遮罩为白色的位置,原始图像显示遮罩为黑色的位置。结果[y:y+h,x:x+w]=crop_mapped#这适用于多个裁剪和粘贴吗?是的,如果我有多个面,你只需对每个部分重复它,如何将颜色过滤器应用于两个面?制作多个裁剪,然后在对其应用热图后重新插入。或者将热图应用于完整图像,然后从要应用热图的所有区域制作遮罩。然后使用遮罩组合原始图像和彩色图像,以便热图显示遮罩为白色的位置,原始图像显示遮罩为黑色的位置。结果[y:y+h,x:x+w]=crop_mapped#这适用于多个裁剪和粘贴吗?是的,您只需对所需的每个部分重复它
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()