(数字图像处理MATLAB+Python)第七章图像锐化-第四节:频域高通滤波与综合案例

2023-05-16

文章目录

  • 一:频域高通滤波
    • (1)理想的高通滤波器
    • (2)巴特沃斯高通滤波器
    • (3)指数高通滤波器
    • (4)梯形高通滤波器
  • 二:综合案例——人像美化
    • (1)设计思路
    • (2)各模块设计
    • (3)程序

一:频域高通滤波

频域高通滤波:是一种基于频域表示的图像处理技术,用于增强或突出图像中高频成分的方法。它通过将图像转换到频域,应用高通滤波器来抑制或减弱低频成分,从而增强图像的边缘和细节
在这里插入图片描述

在频域中,可以设计各种类型的高通滤波器来实现不同的频率响应

(1)理想的高通滤波器

理想的高通滤波器:通过在频率域上施加一个截止频率,将低于该截止频率的成分完全抑制,而保留高于截止频率的成分。这种滤波器具有陡峭的截止特性,但会引入振铃效应

H ( u , v ) = { 0 D ( u , v ) ≤ D 0 1 D ( u , v ) > D 0 H(u, v)=\left\{\begin{array}{ll}0 & D(u, v) \leq D_{0} \\1 & D(u, v)>D_{0}\end{array}\right. H(u,v)={01D(u,v)D0D(u,v)>D0

在这里插入图片描述

在这里插入图片描述

(2)巴特沃斯高通滤波器

巴特沃斯高通滤波器:提供了更平滑的频率过渡,并且没有振铃效应。它可以根据设计参数调整截止频率和滚降特性的斜率

H ( u , v ) = 1 1 + [ D 0 / D ( u , v ) ] 2 n H(u, v)=\frac{1}{1+\left[D_{0} / D(u, v)\right]^{2 n}} H(u,v)=1+[D0/D(u,v)]2n1

在这里插入图片描述

在这里插入图片描述

(3)指数高通滤波器

指数高通滤波器:基于指数函数的特性,在频域上实现对低频信号的抑制,从而提取图像的高频细节

H ( u , v ) = exp ⁡ { − [ D 0 D ( u , v ) ] u } H(u, v)=\exp \left\{-\left[\frac{D_{0}}{D(u, v)}\right]^{u}\right\} H(u,v)=exp{[D(u,v)D0]u}

在这里插入图片描述

在这里插入图片描述

(4)梯形高通滤波器

梯形高通滤波器:与其他高通滤波器不同,梯形高通滤波器的频率响应以梯形的形状逐渐减弱低频信号并保留高频信号

H ( u , v ) = { 0 D ( u , v ) < D 0 1 D 1 − D 0 [ D ( u , v ) − D 0 ] D 0 ≤ D ( u , v ) ≤ D 1 1 D ( u , v ) > D 1 H(u, v)=\left\{\begin{array}{cc}0 & D(u, v)<D_{0} \\\frac{1}{D_{1}-D_{0}}\left[D(u, v)-D_{0}\right] & D_{0} \leq D(u, v) \leq D_{1} \\1 & D(u, v)>D_{1}\end{array}\right. H(u,v)= 0D1D01[D(u,v)D0]1D(u,v)<D0D0D(u,v)D1D(u,v)>D1

在这里插入图片描述

在这里插入图片描述

二:综合案例——人像美化

(1)设计思路

要求:尽可能地使皮肤变得平滑、白皙。采用所学基础处理方法实现题目要求

操作

  • 图像平滑处理,去除瑕疵
  • 基于肤色模型的皮肤区域分割;
  • 将原始图像的背景部分和平滑的皮肤图像进行融合;
  • 对融合后的图像进行适度锐化

(2)各模块设计

主程序

在这里插入图片描述

平滑:双边滤波

在这里插入图片描述

皮肤区域分割
在这里插入图片描述

图像融合:将双边滤波后的图像提取肤色区域,原图提取背景区域,两图融合

在这里插入图片描述

图像锐化:p采用拉普拉斯算子锐化,锐化力度降为1/3

在这里插入图片描述

(3)程序

matlab实现

clear,clc,close all;
ImageOrigin=im2double(imread('face8.jpg'));
figure,imshow(ImageOrigin),title('原图');
DBImage=DBfilt(ImageOrigin);

SkinImage1=FirstFilter(ImageOrigin);            %%初步过滤
SkinArea=SecondFilter(SkinImage1);           %%YCgCr空间范围肤色检测

SkinFuse=Fuse(ImageOrigin,DBImage,SkinArea);
SkinBeautify=Sharp(SkinFuse);

function Out=DBfilt(In)
    [height,width,c] = size(In); 
    win=15;       % 定义双边滤波窗口宽度  
    sigma_s=6; sigma_r=0.1; % 双边滤波的两个标准差参数  
    [X,Y] = meshgrid(-win:win,-win:win); 
    Gs = exp(-(X.^2+Y.^2)/(2*sigma_s^2));%计算邻域内的空间权值    
    Out=zeros(height,width,c); 
    for k=1:c
        for j=1:height    
            for i=1:width  
                temp=In(max(j-win,1):min(j+win,height),max(i-win,1):min(i+win,width),k);
                Gr = exp(-(temp-In(j,i,k)).^2/(2*sigma_r^2));%计算灰度邻近权值        
                % W为空间权值Gs和灰度权值Gr的乘积       
                W = Gr.*Gs((max(j-win,1):min(j+win,height))-j+win+1,(max(i-win,1):min(i+win,width))-i+win+1);      
                Out(j,i,k)=sum(W(:).*temp(:))/sum(W(:));            
            end
        end  
    end
    figure,imshow(Out),title('双边滤波');
end
function Out=FirstFilter(In)
    Out=In;
    [height,width,c] = size(In); 
    IR=In(:,:,1); IG=In(:,:,2);IB=In(:,:,3);
    for j=1:height
        for i=1:width
            if (IR(j,i)<160/255 && IG(j,i)<160/255 && IB(j,i)<160) && (IR(j,i)>IG(j,i) && IG(j,i)>IB(j,i))
                Out(j,i,:)=0;
            end
            if IR(j,i)+IG(j,i)>500/255
                Out(j,i,:)=0;
            end
            if IR(j,i)<70/255 && IG(j,i)<40/255 && IB(j,i)<20/255
                Out(j,i,:)=0;
            end
        end
    end
 
    figure,imshow(Out);title('非肤色初步过滤'); 
end
function Out=SecondFilter(In)
    IR=In(:,:,1); IG=In(:,:,2);IB=In(:,:,3);       
    [height,width,c] = size(In);
    Out=zeros(height,width);
    for i=1:width
        for j=1:height  
           R=IR(j,i); G=IG(j,i); B=IB(j,i);       
           Cg=(-81.085)*R+(112)*G+(-30.915)*B+128;  
           Cr=(112)*R+(-93.786)*G+(-18.214)*B+128;         
           if Cg>=85 && Cg<=135 && Cr>=-Cg+260 && Cr<=-Cg+280       
               Out(j,i)=1;          
           end
        end
    end
    Out=medfilt2(Out,[3 3]);
    
    figure,imshow(Out),title('YCgCr空间范围肤色检测');    
end

function Out=Fuse(ImageOrigin,DBImage,SkinArea)
    Skin=zeros(size(ImageOrigin));
    Skin(:,:,1)=SkinArea;   
    Skin(:,:,2)=SkinArea;  
    Skin(:,:,3)=SkinArea;
    Out=DBImage.*Skin+double(ImageOrigin).*(1-Skin);
    
    figure,imshow(Out);title('肤色与背景图像融合');
end
function Out=Sharp(In)
    H=[0 -1 0;-1 4 -1;0 -1 0]; %Laplacian锐化模板
    Out(:,:,:)=imfilter(In(:,:,:),H); 
    Out=Out/3+In;
%     imwrite(Out,'man4.jpg');
    figure,imshow(Out),title('Laplacia锐化图像');
end

Python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

def DBfilt(image):
    height, width, c = image.shape
    win = 15
    sigma_s = 6
    sigma_r = 0.1
    X, Y = np.meshgrid(np.arange(-win, win + 1), np.arange(-win, win + 1))
    Gs = np.exp(-(X**2 + Y**2) / (2 * sigma_s**2))

    output = np.zeros((height, width, c))
    for k in range(c):
        for j in range(height):
            for i in range(width):
                temp = image[max(j - win, 0):min(j + win, height), max(i - win, 0):min(i + win, width), k]
                Gr = np.exp(-(temp - image[j, i, k])**2 / (2 * sigma_r**2))
                W = Gr * Gs[max(j - win, 0):min(j + win, height) - j + win + 1,
                            max(i - win, 0):min(i + win, width) - i + win + 1]
                output[j, i, k] = np.sum(W * temp) / np.sum(W)
    return output

def FirstFilter(image):
    output = np.copy(image)
    height, width, _ = image.shape
    IR = image[:, :, 2]
    IG = image[:, :, 1]
    IB = image[:, :, 0]

    for j in range(height):
        for i in range(width):
            if (IR[j, i] < 160/255 and IG[j, i] < 160/255 and IB[j, i] < 160/255) and \
                    (IR[j, i] > IG[j, i] and IG[j, i] > IB[j, i]):
                output[j, i, :] = 0
            if IR[j, i] + IG[j, i] > 500/255:
                output[j, i, :] = 0
            if IR[j, i] < 70/255 and IG[j, i] < 40/255 and IB[j, i] < 20/255:
                output[j, i, :] = 0
    return output

def SecondFilter(image):
    height, width, _ = image.shape
    IR = image[:, :, 2]
    IG = image[:, :, 1]
    IB = image[:, :, 0]
    output = np.zeros((height, width))

    for i in range(width):
        for j in range(height):
            R = IR[j, i]
            G = IG[j, i]
            B = IB[j, i]
            Cg = (-81.085) * R + (112) * G + (-30.915) * B + 128
            Cr = (112) * R + (-93.786) * G + (-18.214) * B + 128
            if Cg >= 85 and Cg <= 135 and Cr >= -Cg + 260 and Cr <= -Cg + 280:
                output[j, i] = 1
    output = cv2.medianBlur(output.astype(np.float32), 3)
    return output

def Fuse(image, db_image, skin_area):
    skin = np.zeros(image.shape)
    skin[:, :, 0] = skin_area
    skin[:, :, 1] = skin_area
	skin[:, :, 2] = skin_area
	output = db_image * skin + image * (1 - skin)
	return output

def Sharp(image):
	kernel = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], dtype=np.float32)
	output = cv2.filter2D(image, -1, kernel)
	output = output / 3 + image
	return output

# 读取图像
image_origin = cv2.imread('face8.jpg')
image_origin = cv2.cvtColor(image_origin, cv2.COLOR_BGR2RGB)
# 显示原图
plt.figure()
plt.imshow(image_origin)
plt.title('原图')
plt.axis('off')
# 双边滤波
db_image = DBfilt(image_origin)
# 初步过滤
skin_image1 = FirstFilter(image_origin)
plt.figure()
plt.imshow(skin_image1)
plt.title('非肤色初步过滤')
plt.axis('off')
# YCgCr空间范围肤色检测
skin_area = SecondFilter(skin_image1)
plt.figure()
plt.imshow(skin_area, cmap='gray')
plt.title('YCgCr空间范围肤色检测')
plt.axis('off')
# 肤色与背景图像融合
skin_fuse = Fuse(image_origin, db_image, skin_area)
plt.figure()
plt.imshow(skin_fuse)
plt.title('肤色与背景图像融合')
plt.axis('off')
# Laplacian锐化图像
skin_beautify = Sharp(skin_fuse)
plt.figure()
plt.imshow(skin_beautify)
plt.title('Laplacia锐化图像')
plt.axis('off')

plt.show()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(数字图像处理MATLAB+Python)第七章图像锐化-第四节:频域高通滤波与综合案例 的相关文章

  • 51单片机定时器的计数初值

    设定时时间为 5ms xff08 即5000us xff09 xff0c 定时器计数初值为 X xff0c 晶振频率为11 0592MHz xff0c 又 xff0c 定时时间 61 xff08 2 16 X xff09 12 晶振频率 x
  • mybatis-plus分页踩坑

    踩坑情况 引入的mybatis plus框架 用他的IPage分页接口去查询的时候发现接收到的数据并没有按照预料的去分页 也没执行count数量的sql 分析原因 后来去官网找发现是需要有一个分页插件的配置 代码如下 span class
  • Visual Studio 报错:error LNK2019: 无法解析的外部符号

    遇到的完整报错是这样的 xff1a error LNK2019 无法解析的外部符号 34 public thiscall Person Person void 34 0Person 64 64 QAE 64 XZ xff0c 函数 34 p
  • QT基础:QButtonGroup 按钮组的简单演示

    QButtonGroup 是一个按钮组 xff0c 就是将控件进行组合或分组的一个容器 xff0c 但是它并不在设计师里面可以直接拉出来用 在使用 QButtonGroup 的时候需要引入一下 include lt QButtonGroup
  • QT基础:遍历QListWidget,及QListWidget简单演示,适合初学者食用

    QListWidget 是一个列表框 xff0c 关于它的详细介绍可以参考 xff1a Qt QListWidget详解 初学者如果只是想在短时间内了解 QListWidget 的话 xff0c 可以参考这里 1 打开QT xff0c 创建
  • 查看虚拟机操作系统版本

    看虚拟机操作系统版本 xff0c 可以按照以下步骤进行 xff1a 打开虚拟机并登录到操作系统 打开终端 xff0c 输入以下命令 xff1a lsb release a 这个命令会显示操作系统的版本信息 xff0c 包括发行版名称 版本号
  • 汇编语言及其常用指令 3分钟急速了解

    第一部分 xff1a 汇编语言简介 当今计算机科学的领域中 xff0c 汇编语言是一门非常重要的编程语言 汇编语言是一种低级别的语言 xff0c 它直接操作计算机的硬件 xff0c 因此它比高级编程语言更加快速和高效 在本篇文章中 xff0
  • QT Creator实现导出某数据库的某表格,导出的时候将表头写成中文

    具体实现功能 xff1a 实现将某数据库内的某表格 xff0c 导出为execl可以打开的表格文件 xff0c 一般后缀为 xls xff0c 我这里是在Ubuntu环境下演示的 xff0c Windows环境应该也OK 要实现这个功能 x
  • 文献笔记|知识追踪|GKT|Graph-based Knowledge Tracing: Modeling Student Proficiency Using Graph Neural Network

    文章目录 Graph based Knowledge Tracing Modeling Student Proficiency Using Graph Neural Network研究对象面临的问题难点作者的方法FrameworkGKT问题
  • gRPC, Thrift和Dubbo等3种RPC框架的比较

    gRPC是Google开源的一款RPC框架 xff08 Go版本的实现 xff09 xff0c 以protobuf作为IDL xff0c 通过protoc来编译框架代码 gRPC的Java实现的底层网络库是基于Netty开发而来 xff0c
  • 搭建GitLab服务器

    下载 1 点击下载GitLab的rpm文件 2 或者命令下载 xff08 比较慢 xff0c 建议使用第一种方法直接下载 xff09 span class token function wget span https link zhihu
  • 求出a、b、c、d、e,满足ab-cd+e=1方程

    编写一个实验程序 xff0c 求出a b c d e xff0c 满足ab cd 43 e 61 1方程 xff0c 其中所有变量的取值为1 5并且均不相同 分析 xff1a 采用回溯法 xff0c 以找到变量的个数为终结条件 xff0c
  • idea插件 spring-assistant-@valuetoyml,快速定位到yml配置文件

    这里写自定义目录标题 idea插件 spring assistant 64 valuetoyml xff0c 快速定位到yml配置文件 安装 xff0c 在idea的插件市场直接搜索valuetoyml 自己在插件市场下载安装 插件详情 a
  • CA私有证书中心

    CA服务端 安装CA认证软件包中心 linux默认安装了 xff1a span class token function rpm span qf span class token variable span class token vari
  • MarkDown-IT插件使用

    目的 使后端返回数据库返回内容 xff0c 呈现到前端页面时 xff0c 展示它响应的MarkDown语法 实现机制 后端数据库直接存入Markdown语法 xff0c sql数据库字段数据类型建议采用LongText xff0c 后端传输
  • [Rust GUI]fltk-rs的helloworld

    1 安装VSCode 下载安装VSCode 安装VSCode扩展 rust analyzer或rust analyzer CN 2 安装Microsoft C 43 43 生成工具 访问微软官网下载生成工具 xff0c 勾选使用 C 43
  • OpenHarmony/HarmonyOS通用事件

    通用事件 点击事件 组件被点击时触发的事件 事件 onClick event nbsp event nbsp ClickEvent nbsp gt nbsp void 点击动作触发该回调 event返回值见ClickEvent对象说明 Cl
  • 通用信息整理

    通用事件 点击事件 触摸事件 挂载卸载事件 拖拽事件 按键事件 焦点事件
  • OpenHarmony/HarmonyOS文本通用属性

    文本通用属性 作者 坚果 团队 坚果组织 公众号 大前端之旅 润开鸿技术专家 华为HDE InfoQ签约作者 OpenHarmony布道师 擅长HarmonyOS应用开发 熟悉服务卡片开发 在 战码先锋 活动中作为大队长 累计培养三个小队长
  • OpenHarmony/HarmonyOS基础组件之XComponent

    基础组件之XComponent 作者 坚果 团队 坚果派 公众号 大前端之旅 润开鸿技术专家 华为HDE InfoQ签约作者 OpenHarmony布道师 擅长HarmonyOS应用开发 熟悉服务卡片开发 在 战码先锋 活动中作为大队长 累

随机推荐