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

news/2024/10/21 23:06:56/

文章目录

  • 一:频域高通滤波
    • (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:cfor 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(:));            endend  endfigure,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:heightfor i=1:widthif (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;endif IR(j,i)+IG(j,i)>500/255Out(j,i,:)=0;endif IR(j,i)<70/255 && IG(j,i)<40/255 && IB(j,i)<20/255Out(j,i,:)=0;endendendfigure,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:widthfor 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;          endendendOut=medfilt2(Out,[3 3]);figure,imshow(Out),title('YCgCr空间范围肤色检测');    
endfunction 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 pltdef DBfilt(image):height, width, c = image.shapewin = 15sigma_s = 6sigma_r = 0.1X, 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 outputdef FirstFilter(image):output = np.copy(image)height, width, _ = image.shapeIR = 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, :] = 0if IR[j, i] + IG[j, i] > 500/255:output[j, i, :] = 0if IR[j, i] < 70/255 and IG[j, i] < 40/255 and IB[j, i] < 20/255:output[j, i, :] = 0return outputdef SecondFilter(image):height, width, _ = image.shapeIR = 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 + 128Cr = (112) * R + (-93.786) * G + (-18.214) * B + 128if Cg >= 85 and Cg <= 135 and Cr >= -Cg + 260 and Cr <= -Cg + 280:output[j, i] = 1output = cv2.medianBlur(output.astype(np.float32), 3)return outputdef Fuse(image, db_image, skin_area):skin = np.zeros(image.shape)skin[:, :, 0] = skin_areaskin[:, :, 1] = skin_areaskin[:, :, 2] = skin_areaoutput = db_image * skin + image * (1 - skin)return outputdef 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 + imagereturn 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()

http://www.ppmy.cn/news/93186.html

相关文章

25 VueComponent 的生命周期

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 这里…

Linux——网络套接字3|Tcp客户端编写②

根据我们前面写的服务器,server端需要绑定,而client要不要bind呢? 不需要,因为客户端一旦和一个非常具体的端口号绑定,可能会导致端口号绑定多个客户端,因此可能会出现某个客户端无法启动。而服务器需要明确的端口号,因为服务器面对的是众多的客户端,服务器端口号一旦被…

android 12.0Launcher3去掉默认的google搜索栏

1.概述 在12.0定制化开发中,Launcher3去掉搜索栏也是个常见的功能开发,搜索栏就是workspace 第一页和第二页,所以去掉这两页就可以了 2.Launcher3去掉默认的google搜索栏的核心类 packages\apps\Launcher3\src\com\android\launcher3\Workspace.java packages/apps/Launc…

第十六章 开发Productions - ObjectScript Productions - 开发工具和任务

文章目录 第十六章 开发Productions - ObjectScript Productions - 开发工具和任务开发工具和任务门户任务IDE任务 可用的专业课程 第十六章 开发Productions - ObjectScript Productions - 开发工具和任务 开发工具和任务 Productions主要由类定义和一些支持实体组成。创建P…

理解和使用pom.xml 及在idea中具体如何查看依赖冲突情况

pom基本配置说明&#xff0c;直接在下面菜鸟教程中就可以看到 Maven POM | 菜鸟教程 一、关闭父依赖约束 去掉这个模块&#xff0c;依赖约束就会失效&#xff0c;这样每个包之间的依赖冲突的可能性非常大。 <parent><groupId>org.springframework.boot</gr…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十三届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.ADC:开启ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就行了…

leetcode 917. 仅仅反转字母

题目描述解题思路执行结果 leetcode 917. 仅仅反转字母. 题目描述 仅仅反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。 所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&…

SQL注入 - Part 3(带外)

1、DNSLog注入 &#xff08;一种注入新思路&#xff09; 可以看到DNS的解析日志中包含了用户名。 基于此原理&#xff0c;可以手工构造注入点&#xff0c;让DNSlog显示库名、表名等&#xff0c;也可以使用自动化脚本Dnslogsqlinj进行获取。 2、SQL注入的防御 基于关键字&…