图像细节是高频还是低频_ps磨皮教程,高低频磨皮的原理和操作

本文介绍了PS高低频磨皮技术的原理和操作步骤,通过将图像细节与颜色分布分离,实现精细的皮肤修复。在理解了混合模式算法后,你会发现高低频磨皮是一种快速、有效的方法。操作包括将图像分为高频和低频图层,分别处理细节和颜色,最后混合得到接近原图的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始接触高低频磨皮的时候,我也搜索了相当多的相关教程。很多教程里大多都只写了怎么操作,怎么设置,低频高斯模糊,高频修补啥的,自己操作的时候,还是一头雾水。

后来在先详细了解了混合模式算法,再结合高频的设置,也就研究明白了。如果用同一组合的混合模式,那么高频设置参数都是定值,并不是随意设置的。这里也会给大家详细说明一下这么设置的算法依据。

什么叫高低频?

我们用频率来表达图像中的细节程度。那么顾名思义,高频内容就是指具体细节,例如头发、皮肤纹理,色斑、痘、痣等等具体的细节;而低频内容指的是宽泛的内容,例如颜色(色相、明度、饱和度)的分布。

这么解释你应该可以看出来我们要做什么了。依据算法,通过操作将高频和低频部分分离出来,作为两个图层。我们可以通过高频层去修补皮肤纹理,色斑等等问题,通过低频层去均匀肤色。

这种高低频的磨皮方式,看起来高端又复杂。

其实理解了他的原理,就会知道这是一种简单、快速且非常有效的磨皮方式。

现在我们通过对素材图的操作,来具体说明高低频磨皮的原理。

先看一下我们的最终效果图(只磨皮,不调色,不修脸)。

0c6e2aceca5823b90edb8240752a3994.png

让我们开始边操作边讲解吧!

1.将素材图拖进PS中,CTRL+J连续复制两次,得到背景副本图层和背景副本2图层;将背景副本图层命名为低频,背景副本2图层命名为高频。

b02956fac0735c4414fb4c67083e24a4.png

2.先对低频层进行处理,低频层没有算法,低频层是只要保留颜色分布的,细节不要。我们只要对他进行模糊处理,至于哪种模糊方式其实都可以,只不过高斯模糊的效果相对比较好一些,所以都用高斯模糊。

我们先隐藏高频层,选中低频层。点击滤镜>模糊>高斯模糊,移动半径滑块,调整到细节看不清就差不多了,一般你可以看眉毛或睫毛的清晰度来判断,如下图。

这里设置半径为10像素,点击确认即可,这样低频层就算做好设置了。

6b5f80eea205c3c2f2f8257f2059d0b5.png

接着就是对高频层进行处理。

高频层分为2步:先对高频层的原图进行处理,得到高频层的新图;再设置混合模式将高频层和低频层进行混合。

3.处理高频层的原图,得到高频层新图。因为高频层是只要细节,不要颜色分布,而前面低频层已经得到颜色分布,没有细节。所以这里需要做减法,将高频层原图减去低频层得到高频层新图。

那么怎么做减法?

首先选中高频层,点击图像>应用图像,如下图,图层选低频,混合选减去,缩放选2,补偿值选128。

减去混合模式的基本算法是结果色=混合色-底色,这里的混合色就是高频层的原图色,底色是低频色。

而这里我们缩放为2,再加上补偿值,那么最终得到的高频色=(原图色-低频色)/2+128。

(这里还是做个备注:结果色范围值只会在0-255之间,大于255的均为255,小于0的均为0,后面就不再说了)

至于为什么缩放为2,补偿值为128,是为了后面高低频图层混合后,能最大可能得到原图,我们后面线性光混合算法,你就明白了。

3d63f313595df817a9ef0e526a7cf34b.png

4.得到高频层后,我们要将高频层和低频层进行混合,得到近乎原图的混合结果。

这一步我们只需要选中高频层,然后将上面的混合模式改为线性光,那么混合结果就已经基本和原图一样,肉眼分辨不出。

那么为什么线性光模式混合之后,结果就是近乎原图呢?

这个就和线性光混合模式的算法有关。

线性光混合模式算法:结果色=2*混合色+底色-255。这里的混合色就是前面得到的高频色,底色就是低频色。

那么混合之后得到结果色=2*((原图色-低频色)/2+128)+低频色-255;

继续计算一下:结果色=原图色-低频色+256+低频色-255=原图色+1。

从计算结果我们就可以看出来,这样混合得到的结果色基本就等于原图色了。

而且按照算法来说,补偿值用127和128都是可以的,都是和原图最相似的状况。

998c4e3316ff228a913233925fad3c7e.png

5.同时选中高频和低频图层,按住SHIFT,点击图层栏下标的建组,将高低频放进同组。

这样操作的原因是为了方便对比原图,以免修补过程中,修过头。

5ee345ed0a6b663c88a94816d5db858a.png

到这我们的高低频就做好了。我们先对高频层进行修补,再去低频层进行均匀肤色。

6.由于高频层只有细节纹理,没有颜色,那么就可以放心用修补工具修补画笔工具,随意提取用较好的皮肤部分,去修补皮肤不好的地方,不会因为距离远产生色差或者修补突兀的问题。

基本操作:选中高频层,用修补工具,圈出瑕疵位置,拖到皮肤好的地方,自动修补,重复这个操作就可以。

9573a607f7411b0d25714c6aec8c7779.png

不过要注意一点,高光部分的皮肤细节会很少甚至没有。

aaaff4db99b99868693139d5b0ade25e.png

所以高光部分的皮肤,尽量不要用其他正常部分的皮肤修补,而正常部分的皮肤尽量不要用高光部分的皮肤修补。当然你也可以全部修补好之后,再用画笔画出高光部分,也是可以,这里就不多说了。

c86a44d88cf4a1232805ddab3a480867.png

7.高频层修补的差不多,我们再去低频层,进行均匀肤色,均匀肤色用的也是高斯模糊

基本操作,选中低频层,我们用自由套索工具去套取需要均匀肤色的部位,然后点击滤镜>模糊>高斯模糊,移动滑块肤色稍微均匀一点就可以。

06b3a9f45ad805b3cbd1237f715f8edd.png

如果选取的范围里的颜色相差大,半径调整小一些;尽量选取相近颜色部分进行模糊化,要不然边缘会很突兀。

a7751d98ca2b6c9299595f94d57cbb17.png

用套索工具套取前,先设置一下上边栏中套索工具的羽化值,可以稍微大一些,这个也和高斯模糊后边缘和周边皮肤的自然过渡相关。当然羽化值也不能设置太大,如果套取范围较小,羽化值太大,那你实际套取处理的区域就会很小。

82318a8411f497d14e1dee8237e38e86.png

这个根据你的图片,多试几次就可以了。确定好羽化值和高斯模糊半径后,套取处理区域,然后CTRL+F(重复上一步滤镜,也就是高斯模糊滤镜),不断重复套取和CTRL+F的操作就可以。

7b3b6828bc02276ee1f4b7ebc5aebef7.png

4db3ddb8f6c083c98fb4d2342132ada3.png

8.等均匀好肤色后,可以再回到高频层,再修补一下细节。

做好第6和第7步,那么高低频磨皮的完成了,这里大致做了几分钟,效果还可以。

所以说这种方法是简单又高效的磨皮方法。

0c6e2aceca5823b90edb8240752a3994.png

再看一下不同人物图的磨皮效果。

82fbb6adfcfb098201a46f0ca7304718.png
<think>好的,我现在需要帮助用户解决如何用PythonPyQt实现一个带图形界面的高低工具的问题。首先,用户提到想使用Tkinter或PyQt,但参考引用里提到了PyQt,所以可能更适合用PyQt来开发,因为它功能更强大,适合复杂的桌面应用,特别是需要实时预览的情况。 首先,我得考虑应用程序的基本结构。用户需要加载图片,所以需要文件对话框来选择图片。然后是高频低频调节滑块,这两个滑块应该能实时调整参数,并且触发图像处理函数。实时预览是关键,所以每次滑块的值改变时,处理函数需要快速响应,更新显示的图像。 接下来,图像处理部分。高低通常涉及将图像分解为高频细节低频(基础)部分,然后调整它们的混合比例。可能需要使用高斯模糊来分离低频,然后用原图减去低频得到高频。用户调节滑块时,应该是调整这两个部分的混合比例。比如,低频滑块控制低频的强度,高频滑块控制保留多少细节。 然后,如何将这些处理步骤用Python实现呢?可能需要用到OpenCV或PIL库来处理图像。高斯模糊可以使用OpenCV的GaussianBlur函数。分离高低后,根据滑块的值进行混合,然后显示处理后的图像。 在PyQt的界面设计上,主窗口需要包含一个QGraphicsView或QLabel来显示图像,两个QSlider(水平滑块)用于调整参数,以及按钮来加载图片。布局方面,可以使用QVBoxLayoutQHBoxLayout来排列控件。 需要注意的是实时渲染的效率问题。如果用户繁拖动滑块,处理函数可能会被繁调用,这可能导致界面卡顿。所以需要做一些优化,比如使用线程来处理图像,或者在滑块释放时才触发处理函数,但用户希望实时预览,所以可能需要更高效的处理方式,比如限制处理率,或者使用图像缓存。 还有,加载图片时可能需要转换格式,因为PyQt的QPixmap处理的是RGB格式,而OpenCV处理的是BGR,需要注意颜色通道的转换。此外,图像显示可能需要缩放以适应窗口,保持宽高比,避免变形。 测试时,需要确保高低调整的效果符合预期,滑块的范围设置合理(比如0到100),以及实时更新的流畅性。可能还需要处理大图像时的性能问题,比如缩放图像到合适尺寸再处理,或者使用多线程防止界面冻结。 最后,整合所有部分:界面布局、图像加载、实时处理、显示更新。确保代码结构清晰,功能模块化,方便后续维护扩展。</think>以下是用PyQt实现高低工具的完整解决方案(推荐使用PyQt5,因其图形渲染能力更强): ```python import sys import cv2 import numpy as np from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QSlider, QLabel, QVBoxLayout, QHBoxLayout, QFileDialog) from PyQt5.QtGui import QPixmap, QImage from PyQt5.QtCore import Qt class FrequencySeparator: def process(self, img, low=0.5, high=0.5): """高低分离处理核心算法""" low_freq = cv2.GaussianBlur(img, (0,0), 3) # 低频分量 high_freq = img.astype(np.float32) - low_freq # 高频分量 # 应用调节参数 blended = low_freq * low + high_freq * high return np.clip(blended, 0, 255).astype(np.uint8) class MainWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() self.processor = FrequencySeparator() self.original_img = None def initUI(self): # 创建控件 self.img_label = QLabel() self.low_slider = self.create_slider("低频强度", maximum=100) self.high_slider = self.create_slider("高频细节", maximum=100) # 布局设置 control_layout = QVBoxLayout() control_layout.addWidget(self.low_slider) control_layout.addWidget(self.high_slider) main_layout = QHBoxLayout() main_layout.addWidget(self.img_label, 85) main_layout.addLayout(control_layout, 15) container = QWidget() container.setLayout(main_layout) self.setCentralWidget(container) # 初始化窗口 self.setWindowTitle("高低工具") self.setGeometry(300, 300, 800, 600) self.show() def create_slider(self, title, maximum=100): """创建带标签的滑动条""" container = QWidget() layout = QVBoxLayout() label = QLabel(title) slider = QSlider(Qt.Horizontal) slider.setMaximum(maximum) slider.valueChanged.connect(self.update_image) layout.addWidget(label) layout.addWidget(slider) container.setLayout(layout) return container def load_image(self): """加载图像文件""" filename, _ = QFileDialog.getOpenFileName() if filename: self.original_img = cv2.imread(filename) self.update_image() def update_image(self): """实时更新处理后的图像""" if self.original_img is None: return # 获取滑动条参数(归一化到0-1范围) low = self.low_slider.findChild(QSlider).value() / 100 high = self.high_slider.findChild(QSlider).value() / 100 # 图像处理 processed = self.processor.process(self.original_img, low, high) # 转换颜色空间(OpenCV BGR -> Qt RGB) height, width, channel = processed.shape bytes_per_line = 3 * width q_img = QImage(processed.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped() # 显示图像 self.img_label.setPixmap(QPixmap.fromImage(q_img)) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.load_image() # 启动时自动弹出文件选择对话框 sys.exit(app.exec_()) ``` 关键实现要点说明: 1. **界面架构** - 使用`QMainWindow`作为主窗口容器 - 通过`QHBoxLayout`实现左右布局(图像显示区占85%,控制区占15%) - 滑动条使用`QSlider`配合垂直布局实现标签+控件的组合 2. **图像处理核心** - `FrequencySeparator`类封装高低分离算法 - 使用高斯模糊(`cv2.GaussianBlur`)提取低频分量 - 通过原图减去低频分量得到高频细节 - 混合参数通过滑动条值进行实时控制 3. **实时渲染优化** - 采用OpenCV进行高性能图像处理 - 颜色空间转换通过`QImage`直接操作内存数据 - 使用`valueChanged`信号实现参数调整即时反馈 4. **功能扩展建议** ```python # 在MainWindow类中添加菜单栏: def initUI(self): menubar = self.menuBar() file_menu = menubar.addMenu('文件') open_action = QAction('打开', self) open_action.triggered.connect(self.load_image) file_menu.addAction(open_action) # 添加保存功能: def save_image(self): filename, _ = QFileDialog.getSaveFileName() if filename: processed = ... # 获取当前处理后的图像 cv2.imwrite(filename, processed) ``` 典型工作流程: 1. 用户通过菜单或启动时自动弹出对话框选择图片 2. 图像加载后自动显示原始图片 3. 拖动滑动条时实时更新处理效果 4. 高频滑块控制细节保留程度 5. 低频滑块控制肤平滑程度 注意事项: - 建议处理前将图像缩放到合适尺寸(如800x600)以保证实时性 - 对4K等大尺寸图片需要做性能优化 - 可添加Gamma校正等预处理提升视觉效果 - 可通过`cv2.cvtColor(img, cv2.COLOR_BGR2LAB)`转换到LAB色彩空间获得更好的人像处理效果[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值