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分量实现:
- 将Cb通道向负方向偏移(增加青色)
- 将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单独调整天空的蓝色和草地的绿色。
