zoukankan      html  css  js  c++  java
  • 利用高斯金字塔制作图像显著图

    显著图:

    显著图是将一幅图像中最容易吸引人眼球的部分突出表现的图像
    虽然现在我们通常使用深度学习的方法计算显著图,但是一开始人们用图像的RGB成分或者HSV成分创建高斯金字塔,并通过求差来得到显著图。
    有关高斯金字塔的描述,读者可查看:
    知乎大神讲解高斯金字塔
    自己实现高斯金字塔

    我提供了使用高斯金字塔来简单地求显著图的算法:

    1. 我们使用双线性插值调整图像大小至原图的 1/2 1/4 1/8...... ,再使用双线性插值将生成的这些图像放大到原来的大小。
    2. 将得到的金字塔(我们将金字塔的各层分别编号为0,1,2,3,4,5)两两求差。
    3. 将第二部得到的差全部相加,并正规化到[0,255]。
      完成以上步骤就可以得到显著图了。我们知道在缩小放大的过程中,图像的边缘变化较大,通过将缩小放大后的图像做差,我们得到的是图像灰度剧烈变化的区域,同时也是我们眼球感兴趣的区域。

    实验:利用高斯金字塔制作图像的显著图:

    # 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()
    

    原图
    显著图

    可以看到,显著图中亮的部分就是我们的眼睛会特别注意的部分,没错,就是炮姐的卡姿兰大眼睛。

    点个赞再走呗!
  • 相关阅读:
    POJ-2528 Mayor's posters 线段树 离散化
    POJ 3468 A Simple Problem with Integers 线段树区间修改
    CodeForces
    POJ3208 Apocalypse Someday 数位DP经典绝世好题
    CodeForces114 Double Happiness 数论 二次筛法 bitset的应用
    P3146 [USACO16OPEN]248 G 区间DP 暴力DP
    【Python学习】requests短连接
    【Windows学习】免登录和自动登录
    【Linux学习】expect远程下载和上传样例
    【Linux学习】软件包管理-wget,rpm,yum,apt-get
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12567392.html
Copyright © 2011-2022 走看看