显著图是将一幅图像中最容易吸引人眼球的部分突出表现的图像
虽然现在我们通常使用深度学习的方法计算显著图,但是一开始人们用图像的RGB成分或者HSV成分创建高斯金字塔,并通过求差来得到显著图。
有关高斯金字塔的描述,读者可查看:
知乎大神讲解高斯金字塔
自己实现高斯金字塔
# Writer : wojianxinygcl@163.com
# Date : 2020.3.25
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# make image pyramid
def make_pyramid(gray):
# 裁剪图像
H,W = gray.shape
H -= H % 32
W -= W % 32
out = np.zeros((H,W),dtype=np.uint8)
out = gray[:H,:W]
# first element
pyramid = [out]
# each scale
for i in range(1, 6):
# define scale
a = 2. ** i
# down scale
p = cv.resize(out, (int(out.shape[1] / a), int(out.shape[0] / a)),interpolation=cv.INTER_LINEAR)
# up scale
p = cv.resize(p, (int(p.shape[1] * a), int(p.shape[0] * a)),interpolation=cv.INTER_LINEAR)
# add pyramid list
pyramid.append(p.astype(np.float32))
return pyramid
# make saliency map
def saliency_map(pyramid):
# get shape
H, W = pyramid[0].shape
# prepare out image
out = np.zeros((H, W), dtype=np.float32)
# add each difference
out += np.abs(pyramid[0] - pyramid[5])
out += np.abs(pyramid[0] - pyramid[4])
out += np.abs(pyramid[0] - pyramid[3])
out += np.abs(pyramid[3] - pyramid[2])
out += np.abs(pyramid[4] - pyramid[1])
out += np.abs(pyramid[5] - pyramid[0])
# normalization
out = out / out.max() * 255
return out
# Read image
img = cv.imread("../paojie.jpg")
# grayscale
gray = cv.cvtColor(img,cv.COLOR_RGB2GRAY)
# pyramid
pyramid = make_pyramid(gray)
# pyramid -> saliency
out = saliency_map(pyramid)
out = out.astype(np.uint8)
# Save result
cv.imshow("result", out)
cv.imwrite("out.jpg", out)
cv.waitKey(0)
cv.destroyAllWindows()
原文:https://www.cnblogs.com/wojianxin/p/12567392.html