混合图像python旗舰版

news2025/1/6 20:09:58

仔细看这个图像。然后后退几米再看。你看到了什么?

混合图像是指将一张图片的低频与另一张图片的高频相结合的图片。根据观看距离的不同,所得到的图像有两种解释。在上面的图片中,你可以看到阿尔伯特·爱因斯坦,一旦你离开屏幕或缩小观众的图像大小,他就变成了玛丽莲·梦露。这个概念是在2006年的论文中提出的。为了实现这一效果,您必须实现低通和高通滤波操作来应用于您选择的两幅图像,并线性组合过滤后的图像,得到具有所需的两种解释的混合图像,即最后将只有低频信息的图片和只有高频信息的图像叠加在一起。

对于图像的低频部分:可以理解为图像的“轮廓”,比如一幅画的线条等。

对于图像的高频部分:可以理解为图像的“细节”,比如一幅画的颜色搭配,颜色深度等。

值得一提的是:对图像做模糊处理后得到了图像的低频部分,对图像做锐化处理会让图像的高频信息更多。

实现过滤功能

步骤

您的目标是在hybrid.py中实现以下函数:

  1. cross_correlation_2d:实现了你的过滤功能的核心;

  1. convolve_2d:必须使用cross_correlation_2d功能;

  1. gaussian_blur_kernel_2d:你在这里创建的高斯核,与convolve_2d配对,创建一个高斯模糊滤波器;

  1. low_pass:从图像中删除细节,你的实现必须使用高斯模糊;

  1. high_pass:保留很细的细节和删除低频,您的实现必须使用高斯模糊作为一个子例程。

注意,您必须从头开始实现所有的函数,只使用基本的矩阵操作,而任何来自NumPy、OpenCV、Scipy或类似包的任何过滤函数都是禁止的。功能,如填充,创建网格网格,等。被认为是基本的操作,如果您想快速编写代码并避免多个嵌套的Python循环,则是允许的。

生成混合图像

一旦在hybrid.py中实现了函数,使用提供的创建混合图像。然而,创建一个被我们的大脑很好地解释的混合图像的一个重要因素是对齐两个图像的显著特征。注意:如果您使用多个嵌套的Python循环来实现过滤操作,那么您的函数可能会非常慢。在更改参数后,您必须保持耐心,或者使用基本的矩阵功能来更加努力地优化代码。

最终,你应该得到一张像下面这样的图片:

import cv2
import numpy as np

def cross_correlation_2d(img, kernel):
    '''Given a kernel of arbitrary m x n dimensions, with both m and n being
    odd, compute the cross correlation of the given image with the given
    kernel, such that the output is of the same dimensions as the image and that
    you assume the pixels out of the bounds of the image to be zero. Note that
    you need to apply the kernel to each channel separately, if the given image
    is an RGB image.

    Inputs:
        img:    Either an RGB image (height x width x 3) or a grayscale image
                (height x width) as a numpy array.
        kernel: A 2D numpy array (m x n), with m and n both odd (but may not be
                equal).

    Output:
        Return an image of the same dimensions as the input image (same width,
        height and the number of color channels)
    '''
    # TODO-BLOCK-BEGIN
     # rotating kernel with 180 degrees
    kernel = np.rot90(kernel, 2)

    kernel_heigh = int(np.array(kernel).shape[0])
    kernel_width = int(np.array(kernel).shape[1])

    # set kernel matrix to random int matrix
    if ((kernel_heigh % 2 != 0) & (kernel_width % 2 != 0)):  # make sure that the scale of kernel is odd
        # the scale of result
        conv_heigh = img.shape[0] - kernel.shape[0] + 1
        conv_width = img.shape[1] - kernel.shape[1] + 1
        conv = np.zeros((conv_heigh, conv_width))
        # convolve
        for i in range(int(conv_heigh)):
            for j in range(int(conv_width )):
                result = (img[i:i + kernel_heigh, j:j + kernel_width] * kernel).sum()
                if(result<0):
                    result = 0
                elif(result>255):
                    result = 255
                conv[i][j] = result
        return conv
    else: 
        raise Exception('make sure that the scale of kernel is odd')
    
    # raise Exception("TODO in hybrid.py not implemented")
    # TODO-BLOCK-END

def convolve_2d(img, kernel):
    '''Use cross_correlation_2d() to carry out a 2D convolution.

    Inputs:
        img:    Either an RGB image (height x width x 3) or a grayscale image
                (height x width) as a numpy array.
        kernel: A 2D numpy array (m x n), with m and n both odd (but may not be
                equal).

    Output:
        Return an image of the same dimensions as the input image (same width,
        height and the number of color channels)
    '''
    # TODO-BLOCK-BEGIN
    # zero padding
    kernel_half_row = int((kernel.shape[0]-1)/2)
    kernel_half_col = int((kernel.shape[1]-1)/2)

    # judge how many channels
    if len(img.shape) == 3:
        img = np.pad(img, ((kernel_half_row, kernel_half_row), (kernel_half_col, kernel_half_col),(0, 0)), 'constant', constant_values=0)

        # if image.shape[2] == 3 or image.shape[2] == 4:
        # if style is png, there will be four channels, but we just need to use the first three
        # if the style is bmp or jpg, there will be three channels
        image_r = img[:, :, 0]
        image_g = img[:, :, 1]
        image_b = img[:, :, 2]
        result_r = cross_correlation_2d(image_r, kernel)
        result_g = cross_correlation_2d(image_g, kernel)
        result_b = cross_correlation_2d(image_b, kernel)
        result_picture = np.dstack([result_r, result_g, result_b])
    # if the picture is black and white
    elif len(img.shape) == 2:
        img = np.pad(img, ((kernel_half_row, kernel_half_row), (kernel_half_col, kernel_half_col)), 'constant', constant_values=0)
        result_picture = cross_correlation_2d(img, kernel)

    # returns the convolved image (of the same shape as the input image)
    return result_picture
    # raise Exception("TODO in hybrid.py not implemented")
    # TODO-BLOCK-END

def gaussian_blur_kernel_2d(sigma, height, width):
    '''Return a Gaussian blur kernel of the given dimensions and with the given
    sigma. Note that width and height are different.

    Input:
        sigma:  The parameter that controls the radius of the Gaussian blur.
                Note that, in our case, it is a circular Gaussian (symmetric
                across height and width).
        width:  The width of the kernel.
        height: The height of the kernel.

    Output:
        Return a kernel of dimensions height x width such that convolving it
        with an image results in a Gaussian-blurred image.
    '''
    # TODO-BLOCK-BEGIN
    m,n = [(ss-1.)/2. for ss in (height, width)]
    y, x = np.ogrid[-m:m+1, -n:n+1]
    h = np.exp( - (x*x + y*y) / (2.*sigma*sigma))
    h[ h < np.finfo(h.dtype).eps*h.max()] = 0
    sumh = h.sum()
    if sumh != 0:
        h /= sumh
    return h
    # raise Exception("TODO in hybrid.py not implemented")
    # TODO-BLOCK-END

def low_pass(img, sigma, size):
    '''Filter the image as if its filtered with a low pass filter of the given
    sigma and a square kernel of the given size. A low pass filter supresses
    the higher frequency components (finer details) of the image.

    Output:
        Return an image of the same dimensions as the input image (same width,
        height and the number of color channels)
    '''
    # TODO-BLOCK-BEGIN
    # make kernel
    low_kernel = gaussian_blur_kernel_2d(sigma, size, size)

    # convolve low-pass pictures
    low_image = convolve_2d(img, low_kernel)

    return low_image
    # raise Exception("TODO in hybrid.py not implemented")
    # TODO-BLOCK-END

def high_pass(img, sigma, size):
    '''Filter the image as if its filtered with a high pass filter of the given
    sigma and a square kernel of the given size. A high pass filter suppresses
    the lower frequency components (coarse details) of the image.

    Output:
        Return an image of the same dimensions as the input image (same width,
        height and the number of color channels)
    '''
    # TODO-BLOCK-BEGIN
     # make kernel
    high_kernel = gaussian_blur_kernel_2d(sigma, size, size)

    # make high-pass picture
    high_image = (img - convolve_2d(img, high_kernel))

    return high_image
    # raise Exception("TODO in hybrid.py not implemented")
    # TODO-BLOCK-END

def create_hybrid_image(img1, img2, sigma1, size1, high_low1, sigma2, size2,
        high_low2, mixin_ratio, scale_factor):
    '''This function adds two images to create a hybrid image, based on
    parameters specified by the user.'''
    high_low1 = high_low1.lower()
    high_low2 = high_low2.lower()

    if img1.dtype == np.uint8:
        img1 = img1.astype(np.float32) / 255.0
        img2 = img2.astype(np.float32) / 255.0

    if high_low1 == 'low':
        img1 = low_pass(img1, sigma1, size1)
    else:
        img1 = high_pass(img1, sigma1, size1)

    if high_low2 == 'low':
        img2 = low_pass(img2, sigma2, size2)
    else:
        img2 = high_pass(img2, sigma2, size2)

    img1 *=  (1 - mixin_ratio)
    img2 *= mixin_ratio
    cv2.imshow('img1', img1)
    cv2.imshow('img2', img2)
    cv2.imwrite('high_left.png', img1)
    cv2.imwrite('low_right.png', img2)
    hybrid_img = (img1 + img2) * scale_factor
    return (hybrid_img * 255).clip(0, 255).astype(np.uint8)

if __name__ == "__main__":
    hybrid_image = create_hybrid_image(
        img1=cv2.imread(r'resources\cat.jpg'),
        img2=cv2.imread(r'resources\dog.jpg'),
        sigma1=7,
        size1=29,
        high_low1='high',
        sigma2=7.0,
        size2=29,
        high_low2='low',
        mixin_ratio=0.5,
        scale_factor=1
    )
    cv2.imshow('hybrid_image', hybrid_image)
    cv2.waitKey(0)
    cv2.imwrite('hybrid_image.png', hybrid_image)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UG曲面造型-搭建轮廓和曲面创建(通过网格曲面,填充曲面,割面补面,曲面合格性分析)

先在xy平面创建一段圆弧&#xff0c;圆弧两端固定在坐标轴上在yz平面创建一段圆弧&#xff0c;圆弧两端固定在坐标轴上最后在xz平面创建圆弧&#xff0c;圆弧两端与之前的两个圆弧端点重合完成之后的草图如下&#xff1a;接下来构造曲面&#xff1a;方法1&#xff1a;采用通过曲…

HTML、CSS学习笔记5(移动端基础知识、Flex布局)

一、移动端基础知识 1.PC端和移动端区别 移动端&#xff1a;手机版网页&#xff0c;手机屏幕小&#xff0c;网页宽度多数为100%&#xff0c;没有版心 PC端&#xff1a;电脑版网页&#xff0c;屏幕大&#xff0c;网页固定版心 PC端和移动端不是同一个网页 2.如何在电脑里面…

pytorch-模型训练常用的torchvision包。关于数据、模型、数据增强、优化器、损失函数。用官方的实现,自定义模型训练

pytoch关于图像数据的部分 一般情况下处理图像、文本、音频和视频数据时&#xff0c;可以使用标准的Python包来加载数据到一个numpy数组中。 然后把这个数组转换成 torch.*Tensor。 图像可以使用 Pillow, OpenCV 音频可以使用 scipy, librosa 文本可以使用原始Python和Cython…

3D立体视觉成像原理介绍【一 】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言什么是基线&#xff1f;基线是如何影响3D图像质量激光三角测量飞行时间结构光相机时间编码结构光前言 本文将介绍3D立体视觉的成像原理&#xff0c;包括【激光三…

【JUC2022】第五章 ThreadLocal

【JUC2022】第五章 ThreadLocal 文章目录【JUC2022】第五章 ThreadLocal一、是什么二、案例三、使用规范四、源码分析五、内存泄漏问题六、实际应用 Demo一、是什么 ThreadLocal 提供线程局部变量&#xff0c;这些变量与正常的变量不同&#xff0c;因为每一个线程在访问 Threa…

Qt Widget之QMainWindow

目录 一 QMainWindow整体概况 二 菜单栏 三 工具栏 四 状态栏 五 铆接部件 六 核心部件 七 总体效果 一 QMainWindow整体概况 QMainWindow是主窗口程序&#xff0c;由以下几个部分构成&#xff1a;菜单栏&#xff0c;状态栏&#xff0c;工具栏&#xff0c;铆接部件和核…

Nginx优化服务和防盗链

Nginx优化服务和防盗链一、长连接1、修改主配置文件2、测试3、在主配置文件添加4、验证二、Nginx第三方模块1、开源的echo模块2、查看是否成功3、加echo模块步骤4、网页测试验证三、搭建虚拟主机1、编译安装好nginx后&#xff0c;对主配置文件进行修改2、创建文件3、验证四、防…

Android 源码中的 JNI,到底是如何使用的?

Linux下 JNI的使用学习 Android 其中涉及对 JNI 的使用&#xff1b;JNI的使用对于 Android 来说又是十分的重要和关键。那么到底 Java 到底是如何调用 C/C 的&#xff0c;下面是非常简单的计算器源码&#xff0c;只是用来熟悉JNI的基本语法&#xff0c;其中我自己碰到过的一个问…

Unity 使用L2Localization实现App切换多国语言

Unity 使用 L2 Localization实现App切换多国语言一、L2 Localization介绍二、使用步骤1.导入插件&#xff0c;新建Language和Term2.开始使用&#xff0c;切换语言总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;会提供自己的插件下载地址 一、L2 Localization介绍 这…

day24_多线程进阶

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、生产者消费者 六、线程池 零、 复习昨日 创建线程的几种方式 1) 继承 2) 实现Runnable 3) calla…

【jeecg】vue-cli-service不是内部或外部命令,也不是可运行的程序

npm run serve时&#xff0c;报错 vue-cli-service不是内部或外部命令,也不是可运行的程序 参考该链接 &#xff0c;找到生成的log文件&#xff0c; 在log文件里看到了C盘的地址 找到这个地址&#xff0c;发现里面有 我之前下载的yarn &#xff08;原来下在了这里&#xff09;没…

微服务一 实用篇 - 4.1 RabbitMQ部署

《微服务一 实用篇 - 4.1 RabbitMQ部署》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《微服务一 实用篇 - 4.1 RabbitMQ部署》《微服务一 实用篇 - 4.1 RabbitMQ部署》RabbitMQ部署指南1.单机部署1.1.下载镜像1.2.安装MQ2.集群部署2.1.集群分类2.2.设…

B - Build Roads (最小生成树 + 打表)

https://vjudge.net/problem/Gym-103118B/origin 在猫的国度里&#xff0c;有n个城市。猫国国王想要修n -1条路来连接所有的城市。第i市有一家ai经验价值的建筑公司。要在第i市和第j市之间修建公路&#xff0c;两个城市的建筑公司需要相互合作。但是&#xff0c;在修路的过程中…

Windows安装VMware+创建Linux虚拟机

目录1&#xff1a;简介2&#xff1a;功能特点3&#xff1a;VM下载地址4&#xff1a;安装VMware5&#xff1a;下载iso虚拟机镜像6&#xff1a;创建Linux虚拟机7&#xff1a;配置静态ip1&#xff1a;简介 VMware Workstation Pro&#xff08;曾用名VMware Workstation&#xff09…

供应商绩效管理指南:挑战、考核指标与管理工具

管理和优化供应商绩效既关键又具有挑战性。要知道价格并不是一切&#xff0c;如果你的供应商在商定的价格范围内向你开具发票&#xff0c;但服务达不到标准或货物不合格&#xff0c;你也无法达到节约成本的目标。 供应商绩效管理可以深入了解供应商可能带来的风险&#xff0c…

SpringCloud之认识微服务

文章目录一、传统项目转型二、走进 SpringCloud三、微服务项目搭建3.1 创建一个 SpringBoot 项目3.2 创建三个 Maven 子工程3.3 为子工程创建 application.yml3.4 引入依赖3.5 数据库 建库建表3.6 编写业务提示&#xff1a;以下是本篇文章正文内容&#xff0c;SpringCloud系列学…

Vim笔记

文章目录VIM四种模式命令模式编辑模式末行模式可视化模式扩展内容VIM四种模式 1、命令模式 2、编辑模式 3、末行模式 4、可视化模式 5、VIM四种模式的关系 命令模式 1、命令模式下我们能做什么&#xff1a;① 移动光标 ② 复制 粘贴 ③ 剪切 粘贴 删除 ④ 撤销与恢复 2、进…

【分布式】分布式唯一 ID 的 8 种生成方案

文章目录前言正文什么是分布式ID&#xff1f;分布式ID的特性&#xff1f;分布式ID的生成方案1. UUID2. 数据库自增ID3. 批量生成ID4. Redis生成ID5. Twitter的snowflake算法6. 百度UidGenerator7. 美团Leaf8.滴滴&#xff08;Tinyid&#xff09;小结前言 在互联网的业务系统中…

Leaflet基础入门教程(一)

leaflet是一个前端的轻量的gis框架,为什么说它轻量呢。因为相比于传统的“庞大的”GIS框架比如openlayers和mapbox,leaflet不仅代码体积小,而且API构成也极为简单。是GIS行业小白入门级别学习的最好的框架,没有之一。 那么话不多说我们首先来学习一下如何使用leaflet搭建一…

Vue3中hook的使用及使用中遇到的坑

目录前言一&#xff0c;什么是hook二&#xff0c; hook函数的使用2.1 铺垫2.2 hook函数的写法2.3 使用写好的hook函数后记前言 在学习Es6的时候&#xff0c;我们开始使用类与对象&#xff0c;开始模块化管理&#xff1b;在Vue中我们可以使用mixin进行模块化管理&#xff1b;Vu…