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

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-127Cr: 133-173ycbcr_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单独调整天空的蓝色和草地的绿色。