当前位置: 首页 > news >正文

MATLAB图像处理实战:用HSV和YCbCr模型给你的照片换个“滤镜”(附完整代码)

MATLAB图像处理实战:用HSV和YCbCr模型给你的照片换个“滤镜”(附完整代码)

当你翻看手机相册时,是否想过给那些平淡的照片加点“魔法”?在MATLAB里,我们不需要复杂的Photoshop技巧,只需几行代码就能实现专业级的滤镜效果。今天,我们就用HSV和YCbCr这两种颜色模型,带你玩转图像处理,让普通照片秒变大片。

1. 颜色模型:图像处理的秘密武器

颜色模型是描述颜色的数学方法,就像调色师的颜料盘。不同的模型各有特点:

  • RGB模型:最基础的模型,用红绿蓝三原色混合。但调整时容易影响整体画面,不够灵活。
  • HSV模型:更贴近人眼感知,分为色调(H)、饱和度(S)、明度(V)。适合单独调整颜色风格。
  • YCbCr模型:将亮度(Y)和色度(CbCr)分离,常用于视频和图像压缩。特别适合人像优化。
% 示例:读取测试图像 img = imread('test.jpg'); figure, imshow(img), title('原始图像');

2. HSV滤镜:一键改变照片氛围

HSV模型就像个直观的调色盘。通过调整三个分量,我们可以轻松实现不同风格的滤镜效果。

2.1 复古暖色调滤镜

将色调(H)向红色区域偏移,同时降低饱和度(S),增加明度(V):

hsv_img = rgb2hsv(img); hsv_img(:,:,1) = mod(hsv_img(:,:,1) + 0.1, 1); % 色调+10% hsv_img(:,:,2) = hsv_img(:,:,2) * 0.8; % 饱和度降低20% hsv_img(:,:,3) = hsv_img(:,:,3) * 1.1; % 亮度提高10% vintage_img = hsv2rgb(hsv_img); figure, imshow([img, vintage_img]); title('左侧:原始图像 | 右侧:复古滤镜');

2.2 清新冷色调滤镜

相反方向调整HSV参数,可以得到清爽的夏日风格:

参数调整方式效果
H-0.15偏蓝绿色调
S×1.2增强色彩鲜艳度
V×0.9略微降低亮度
hsv_img = rgb2hsv(img); hsv_img(:,:,1) = mod(hsv_img(:,:,1) - 0.15, 1); hsv_img(:,:,2) = min(hsv_img(:,:,2) * 1.2, 1); hsv_img(:,:,3) = hsv_img(:,:,3) * 0.9; cool_img = hsv2rgb(hsv_img);

3. YCbCr滤镜:专业级人像优化

YCbCr模型将亮度与颜色信息分离,特别适合人像照片的精细调整。

3.1 肤色美化技巧

亚洲人肤色在CbCr空间的典型值范围:

  • Cb: 77-127
  • Cr: 133-173
ycbcr_img = rgb2ycbcr(img); % 增强肤色区域 skin_mask = (ycbcr_img(:,:,2) > 77 & ycbcr_img(:,:,2) < 127) & ... (ycbcr_img(:,:,3) > 133 & ycbcr_img(:,:,3) < 173); ycbcr_img(:,:,1) = ycbcr_img(:,:,1) .* (1 + 0.15 * double(skin_mask)); beauty_img = ycbcr2rgb(ycbcr_img);

3.2 电影感青橙色调

好莱坞大片常用的色调风格,通过极端调整CbCr分量实现:

  1. 将Cb通道向负方向偏移(增加青色)
  2. 将Cr通道向正方向偏移(增强橙色)
ycbcr_img = rgb2ycbcr(img); ycbcr_img(:,:,2) = ycbcr_img(:,:,2) - 15; % 增加青色 ycbcr_img(:,:,3) = ycbcr_img(:,:,3) + 20; % 增强橙色 % 限制在有效范围内 ycbcr_img(:,:,2) = max(min(ycbcr_img(:,:,2), 240), 16); ycbcr_img(:,:,3) = max(min(ycbcr_img(:,:,3), 240), 16); movie_img = ycbcr2rgb(ycbcr_img);

4. 高级技巧:组合使用两种模型

真正的魔法发生在你将两种模型组合使用时。比如先用HSV调整整体色调,再用YCbCr优化特定区域。

% 第一步:HSV调整创建基本风格 hsv_img = rgb2hsv(img); hsv_img(:,:,1) = mod(hsv_img(:,:,1) + 0.05, 1); % 轻微暖色调 hsv_img(:,:,2) = hsv_img(:,:,2) * 1.1; % 增强饱和度 % 第二步:转换到YCbCr进行局部优化 temp_img = hsv2rgb(hsv_img); ycbcr_img = rgb2ycbcr(temp_img); % 增强天空区域(高亮度区域) sky_mask = ycbcr_img(:,:,1) > 180; ycbcr_img(:,:,2) = ycbcr_img(:,:,2) - 10 .* double(sky_mask); % 天空更蓝 final_img = ycbcr2rgb(ycbcr_img); figure, imshow(final_img); title('组合调整后的效果');

提示:使用mask变量可以帮助我们精准控制调整区域,避免影响整张图片。

5. 完整代码示例:一键滤镜生成器

下面这个函数整合了上述所有技巧,你可以直接调用它来应用各种预设滤镜:

function filtered_img = applyFilter(img, filter_type) % 输入检查 if nargin < 2 filter_type = 'vintage'; end % 确保图像是double类型 if ~isa(img, 'double') img = im2double(img); end switch lower(filter_type) case 'vintage' % 复古滤镜 hsv_img = rgb2hsv(img); hsv_img(:,:,1) = mod(hsv_img(:,:,1) + 0.1, 1); hsv_img(:,:,2) = hsv_img(:,:,2) * 0.8; hsv_img(:,:,3) = hsv_img(:,:,3) * 1.1; filtered_img = hsv2rgb(hsv_img); case 'cool' % 冷色调滤镜 hsv_img = rgb2hsv(img); hsv_img(:,:,1) = mod(hsv_img(:,:,1) - 0.15, 1); hsv_img(:,:,2) = min(hsv_img(:,:,2) * 1.2, 1); hsv_img(:,:,3) = hsv_img(:,:,3) * 0.9; filtered_img = hsv2rgb(hsv_img); case 'beauty' % 人像美化 ycbcr_img = rgb2ycbcr(img); skin_mask = (ycbcr_img(:,:,2) > 77 & ycbcr_img(:,:,2) < 127) & ... (ycbcr_img(:,:,3) > 133 & ycbcr_img(:,:,3) < 173); ycbcr_img(:,:,1) = ycbcr_img(:,:,1) .* (1 + 0.15 * double(skin_mask)); filtered_img = ycbcr2rgb(ycbcr_img); case 'movie' % 电影感青橙色调 ycbcr_img = rgb2ycbcr(img); ycbcr_img(:,:,2) = max(ycbcr_img(:,:,2) - 15, 16); ycbcr_img(:,:,3) = min(ycbcr_img(:,:,3) + 20, 240); filtered_img = ycbcr2rgb(ycbcr_img); otherwise filtered_img = img; end end

使用示例:

img = imread('portrait.jpg'); filtered_img = applyFilter(img, 'beauty'); imshow(filtered_img);

在实际项目中,我发现最实用的技巧是先用HSV调整整体色调风格,再用YCbCr进行局部精细优化。比如处理风景照时,先用HSV增强整体饱和度,再用YCbCr单独调整天空的蓝色和草地的绿色。

http://www.jsqmd.com/news/901483/

相关文章:

  • 知识图谱:为AI助手构建关系型上下文,解决复杂决策难题
  • Linux多线程调试:别再只靠打印日志了,试试用pthread_setname_np给线程起个‘花名’
  • 2026年 广州消防泵最新推荐榜单:消防水泵/消防增压泵/立式消防泵/消防稳压泵/多级消防泵/XBD消防泵/消防喷淋泵/消防加压泵实力厂家精选! - 品牌企业推荐师(官方)
  • 零代码搭建你的第一个 AI Agent
  • 告别卡顿!手把手教你将TUM RGBD数据集tgz包转成30Hz流畅bag文件(附Python脚本)
  • Win11系统镜像怎么选?一篇讲清Dev/Beta/RP通道ISO的区别与适用场景
  • 进行信奥的比赛和训练,用开放的比如洛谷,AtCoder、CodeForces等题库好,还是用一些机构、学校或教练自己的内部题库好
  • AI增强编程实战:意图驱动开发与代码生成技术解析
  • 用Python实战检验时间序列的‘无记忆性’:以股票价格为例的马尔可夫性检验
  • TokCode:基于令牌重编码的语义通信抗丢包技术解析
  • 2026年5月中东专线物流公司推荐:TOP5评测专业价格适用场景 - 品牌推荐
  • 戴尔灵越5570亲测:Win11 dwm.exe吃内存?可能是你Intel核显驱动该更新了
  • SAP APO老兵实战复盘:从DP、SNP到PPDS,我们踩过的那些坑与S4HANA迁移实战指南
  • Word打不开报错0xc0000142?除了360和系统修复,这3个冷门但有效的排查思路你可能没想到
  • MCP协议安全漏洞深度解析:命令注入、SSRF与文件访问攻击的防御实践
  • 从信息论到代码:一文搞懂CrossEntropyLoss为何是分类任务的‘标配’
  • LibreCAD深度解析:开源2D CAD的全景透视与实战指南
  • 编译器与解释器区别详解
  • 【花雕学编程】Arduino BLDC 之机器人二维编队跟随(麦克纳姆轮底盘)
  • Wireshark 3.6.7 实战:5分钟从HTTPS流量里“抠”出SSL证书(附避坑指南)
  • 别再抱怨WPS卡了!实测教你手动关闭WPS常驻后台进程,瞬间释放几百M内存
  • 2026年5月北京二手房装修公司推荐:TOP5对比旧房改造防踩坑评测专业价格 - 品牌推荐
  • Prometheus告警怎么推送到钉钉?Alertmanager路由配置与多群分发实战
  • Python数据处理:Pandas基础
  • 如何用Python快速接入Taotoken并调用多款大模型
  • 从Spirent到Vector:车载以太网TC8测试方案怎么选?聊聊我们的踩坑与决策
  • STM32CubeIDE串口DMA实战:从零到一实现高效数据收发(附完整代码)
  • 2026 主流框架怎么选,LangChain 与 AutoGen 实战对比
  • 如何构建基于视觉识别的AI瞄准辅助系统:从原理到部署的完整指南
  • 仅限首批内测团队开放:ChatGPT餐厅推荐生成工业级模板库(含21个行业定制Prompt+5类隐私脱敏策略)