欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

视觉实验(一):混合图像

程序员文章站 2022-03-16 17:47:34
...

基本思想:高频往往在感知中占据着主导地位,人在近处看到的图像为高频部分,人在远处看到图像往往看到的为信号的低频部分。

此时把两张不同物品的图片进行合成,其中一张为高频图像,一张为低频图像。

这样合成的结果就使得同一张图片在远点与近点看到的东西并不一样。

互相关本身为图片与核函数直接点乘得到的结果。

卷积在学术上为把图片反转180度后进行(虽然目前的卷积都是直接点乘)

所谓高频,是指一个信号的频率变化较快

在图像上,就是指图片的变化较大且明显。

#coding:utf-8
from PIL import Image
import cv2
import numpy as np

def cross_correlation_2d(img, kernel):#互相关
    img_array = np.array(img)  #把图像转换为数字
    r= img_array.shape[0]
    c = img_array.shape[1]  # 图像的列
    h = img_array.shape[2]  # 图像的高度
    r2 = kernel.shape[0]  # 核的行
    c2 = kernel.shape[1]  # 核的列
    new1 = np.zeros((r, (int)(c2 / 2)), np.int)  #获得一个新的空白矩阵
    new2= np.zeros(((int)(r2/ 2), c + new1.shape[1] * 2), np.int)
    conv = np.zeros((r, c, h))
    for i in range(3):#对矩阵进行一个互相关运算
        temp_img_array = np.hstack([new1, np.hstack([img_array[:, :, i], new1])]) #对函数增加一个维度
        new_img_array = np.vstack([new2, np.vstack([temp_img_array, new2])])
        for j in range(r):
            for k in range(c):
                conv[j][k][i] = min(max(0,(new_img_array[j:j + r2, k:k + c2]* kernel).sum()),255)
    return conv

def convolve_2d(img, kernel):#卷积
    kernel2 = np.rot90(np.fliplr(kernel), 2) #将图片进行2次逆时针90度翻转
    return cross_correlation_2d(img, kernel2)  # 调用互相关函数

def gaussian_blur_kernel_2d(sigma, height, width): #产生一个高斯核
    gaussian_kernel = np.zeros((height, width), dtype='double')
    center_row = height/2
    center_column = width/2
    s = 2*(sigma**2)
    for i in range(height):
        for j in range(width):
            x = i - center_row
            y = j - center_column
            gaussian_kernel[i][j] = (1.0/(np.pi*s))*np.exp(-float(x**2+y**2)/s)
    return gaussian_kernel   # 返回高斯核

# def print_gaussian(gaussian,height,width):
#     for i in range(height):  #s输出核函数
#         for j in range(width):
#             print(gaussian[i][j]end)
#         print(' \n')
#     print('\n')  # 在经过一次低通核函数输出以后输出高通的核函数
#     print('\n')  # 在经过一次低通核函数输出以后输出高通的核函数
#     print('\n')  # 在经过一次低通核函数输出以后输出高通的核函数
#     print('\n')  # 在经过一次低通核函数输出以后输出高通的核函数

def low_pass(img, sigma,height, width):
    res = gaussian_blur_kernel_2d(sigma,  height, width) #res为一个高斯核
#    print_gaussian(res,height,width)#把核函数输出来看看
    return convolve_2d(img,res) #进行卷积

def high_pass(img,sigma, height, width):
    Image = np.array(img)
    return (img-low_pass(Image,sigma, height, width)) #做一个减法得到高通图像

img1 = Image.open('./resources/dog.jpg')
img2 = Image.open('./resources/cat.jpg')
ratio = 0.6
img1_res = low_pass(img1,4,13,13)#得到低通图像
img2_res = high_pass(img2,7,15,15) #得到高通图像
cv2.imwrite('left.jpg', img1_res)
cv2.imwrite('right.jpg', img2_res)
img_res = cv2.addWeighted(img1_res, ratio, img2_res, ratio, 0) #图像混合加权函数
cv2.imwrite('hybrid.jpg', img_res)

 

相关标签: 视觉