首页 > 其他分享 >1.图像滤波与图像融合

1.图像滤波与图像融合

时间:2024-04-20 15:35:49浏览次数:15  
标签:img crow 滤波 融合 shape pad 图像 np ccol

import numpy as np


def create_gaussian_kernel(k, sigma):
    center = k // 2
    kernel = np.zeros((k, k), dtype=np.float32)
    for i in range(k):
        for j in range(k):
            kernel[i, j] = (1 / (2 * np.pi * sigma**2)) * np.exp(
                -((i - center) ** 2 + (j - center) ** 2) / (2 * sigma**2)
            )
    kernel /= np.sum(kernel)
    return kernel


def conv_2d(img, k, sigma=None):
    assert k % 2 != 0, "卷积核应为奇数"
    pad = k // 2

    # 创建卷积核
    if sigma is None:  # 均值滤波
        kernel = np.ones((k, k), dtype=np.float32) / (k * k)
    else:  # 高斯滤波
        kernel = create_gaussian_kernel(k, sigma)

    # 执行卷积操作
    if len(img.shape) == 2:  # 灰度图像
        H, W = img.shape
        # img_padded = np.pad(img, pad_width=pad, mode='constant')
        img_padded = np.zeros((img.shape[0] + pad * 2, img.shape[1] + pad * 2))
        img_padded[pad:-pad, pad:-pad] = img
        out = np.zeros_like(img, dtype=np.float32)
        for h in range(H):
            for w in range(W):
                out[h, w] = (img_padded[h : h + k, w : w + k] * kernel).sum()
    else:  # 彩色图像
        H, W, C = img.shape
        # img_padded = np.pad(img, pad_width=(pad, pad, (0, 0)), mode='constant')
        img_padded = np.zeros((img.shape[0] + pad * 2, img.shape[1] + pad * 2, C))
        img_padded[pad:-pad, pad:-pad] = img
        out = np.zeros_like(img, dtype=np.float32)
        for h in range(H):
            for w in range(W):
                for c in range(C):
                    out[h, w, c] = (img_padded[h : h + k, w : w + k, c] * kernel).sum()

    out = np.clip(out, 0, 255).astype(np.uint8)
    return out


def normalize_image(img):
    # 找到图像的最小值和最大值
    min_val = np.min(img)
    max_val = np.max(img)

    # 对图像进行归一化
    img_normalized = (img - min_val) * (255 / (max_val - min_val))

    # 确保值在 0 到 255 之间
    img_normalized = np.clip(img_normalized, 0, 255)

    # 转换数据类型为 uint8
    img_normalized = img_normalized.astype(np.uint8)

    return img_normalized

def my_filters(img, D=30, tag=None):
    assert tag=='low-pass' or tag=='high-pass', "please choose a tag in 'low-pass' or 'high-pass'"
    f = np.fft.fft2(img)
    fshift = np.fft.fftshift(f)
    H, W = img.shape
    crow, ccol = int(H/2), int(W/2)
    if tag=='low-pass':
        # 构造图像的低通滤波器
        mask = np.zeros((H, W), np.uint8)
        mask[crow-D:crow+D, ccol-D:ccol+D] = 1
        md = fshift * mask
        epsilon = 1e-10
        magnitude_spectrum_md = 20 * np.log(np.abs(md) + epsilon)

        # 低通滤波并显示结果
        ishift_low = np.fft.ifftshift(md)
        iimg_low = np.fft.ifft2(ishift_low)
        iimg_low = np.abs(iimg_low)
        iimg_low = normalize_image(iimg_low)

        return iimg_low, magnitude_spectrum_md
    
    else:
        # 构造A图像的高通滤波器
        fshift[crow-D:crow+D, ccol-D:ccol+D] = 0
        ishift_high = np.fft.ifftshift(fshift)
        iimg_high = np.fft.ifft2(ishift_high)
        iimg_high = np.abs(iimg_high)
        iimg_high = normalize_image(iimg_high)
        magnitude_spectrum_fshift = 20 * np.log(np.abs(fshift)+1)

        return iimg_high, magnitude_spectrum_fshift



def blend_images(image1, image2, d1=30, d2=10, d3=20):
    assert image1.shape == image2.shape, "image1 shape should equal to image2 shape"
    
    # 计算图像A的频谱
    fA = np.fft.fft2(image1)
    fshiftA = np.fft.fftshift(fA)

    # 计算图像B的频谱
    fB = np.fft.fft2(image2)
    fshiftB = np.fft.fftshift(fB)

    # 获取图像大小和频谱中心点
    rows, cols = image1.shape
    crow, ccol = int(rows/2), int(cols/2)

    # 构造A图像的低通滤波器
    maskA = np.zeros((rows, cols), np.uint8)
    maskA[crow-d1:crow+d1, ccol-d1:ccol+d1] = 1
    md = fshiftA * maskA

    # 构造B图像的高通滤波器
    fshiftB[crow-d2:crow+d2, ccol-d2:ccol+d2] = 0

    # A图像低频与B图像高频融合
    fshiftB[crow-d3:crow+d3, ccol-d3:ccol+d3] = md[crow-d3:crow+d3, ccol-d3:ccol+d3]
    ishiftC = np.fft.ifftshift(fshiftB)
    iimgC = np.fft.ifft2(ishiftC)
    iimgC = np.abs(iimgC)
    iimgC = normalize_image(iimgC)

    return iimgC


def gaussian_pyramid(image, levels=6):
    pyramid_images = [image]
    for _ in range(levels-1):
        image = image[::2, ::2]
        pyramid_images.append(image)
    return pyramid_images

标签:img,crow,滤波,融合,shape,pad,图像,np,ccol
From: https://www.cnblogs.com/moguw/p/18147732

相关文章

  • GIS融合之路(六)-Cesium的雨雪风雷电效果
    终于来到系列第六篇了,也来到大家最喜闻乐见天气效果系列传送门:山海鲸可视化:GIS融合之路(一)技术选型CesiumJS/loaders.gl/iTowns?山海鲸可视化:GIS融合之路(二)CesiumJS和ThreeJS深度缓冲区整合山海鲸可视化:GIS融合之路(三)CesiumJS和ThreeJS相机同步山海鲸可视化:GIS融合之路(四)如何......
  • YUV420 转RGB图像
     YUV420转RGB图像      在数字图像处理种YUV格式也是我们经常遇到,与RGB一样也是一种编码格式,开始主要用于电视系统以及模拟视频领域。YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色......
  • C# 中图像和 OnnxRuntime.Tensor 的互转
    因毕设需要,尝试了将PyTorch模型转为ONNX然后用C#做推理,记录一下经验。总的来说,C#对深度学习的支持远不如Python,缺少很多必要的库,不少代码需要自己编写。思路毕设做的是image-to-image的low-level视觉任务,因此需要3个主要步骤:从硬盘读取图片并转成张量(imageto......
  • 特征融合与特征交互的区别
    特征融合与特征交互的区别目录特征融合与特征交互的区别前言三者关系三者定义特性融合(FeatureFusion):特征拼接(FeatureConcatenation):特征交互(FeatureInteraction):特征融合和特征交互关键的不同点数据处理目的应用简单总结前言遥感系列第14篇。遥感图像处理方向的学......
  • 一种融合指代消解序列标注方法在中文人名识别上的应用(上)
    技术领域自然语言处理领域。应用场景:适用于自然语言处理领域,通过命名实体识别(NamedEntityRecognition,NER),准确识别实体。依托自然语言处理领域,基于人民日报数据及构造的舆情公告数据,提出一种融合指代消解的序列标注方法来改进人名识别。解决的问题:实体包括人名、地......
  • 图像简单处理
    需求:对上面多张这样的图像,将成员识别出来,读取本周活跃值。生成一张全部由成员组成的大图思路:使用OpenCVSharp进行目标区域边框检测,根据大小过滤目标区域。使用Tesseract对指定位置进行文字识别(貌似识别精度不高,有乱码。)主要代码usingSystem;usingSystem.Collections.Gener......
  • A7-100T的图像处理开发板
    深圳市飞录科技有限公司一:概述   开发板主控采用XilinxArtix-7系列FPGA,型号为XC7A100T-2FGG676C,具有100KLUTs,240个DSP,芯片集成了LVDS、DDR3,6.6GSerdes等控制器。XilinxArtix-7作为中规模FPGA的典范,选用28nm工艺,性能与解决方案非常成熟,在通信及图像市场的应用非常广......
  • Splice方法的图像化理解
    splice在英语中的意思是拼接,在实际的代码使用中,splice就在数组中起到了一个拼接的作用使用方法splice(x,y,a,b,c,...)其中x、y为数字,a、b、c为新添加的项,意思是从数组的第x项开始删除y项,并在其中添加a、b、c...,其中x、y必填,abc可不填图像理解现在让我们将splice方法想象成一......
  • WPF/C#实现图像滤镜优化方案:打造炫目视觉体验!
    原因:我之所以想做这个项目,是因为在之前查找关于C#/WPF相关资料时,我发现讲解图像滤镜的资源非常稀缺。此外,我注意到许多现有的开源库主要基于CPU进行图像渲染。这种方式在处理大量图像时,会导致CPU的渲染负担过重。因此,我将在下文中介绍如何通过GPU渲染来有效实现图像的各种滤镜效果......
  • 智能驾驶-感知-融合定位IMU
    时间GPS时间(GPST)是基于原子时(AT1)的时间系统,其秒长定义为铯原子(CS133)基态的两个超精细能级间跃迁辐射振荡9192631170周所持续的时间。GPS时间的起算点定义在1980年1月6日世界协调时(UTC)0时UTC时间UTC时间:UniversalTimeCoordinated,中文名称:世界标准时间或......