图像处理 #
一、图像基础 #
1.1 读取和显示 #
matlab
% 读取图像
img = imread('image.jpg');
img = imread('image.png');
% 显示图像
imshow(img);
figure; imshow(img);
% 显示信息
whos img;
size(img); % 尺寸
class(img); % 数据类型
1.2 图像类型 #
matlab
% 灰度图像
gray = rgb2gray(img);
% 二值图像
bw = imbinarize(gray);
% 索引图像
[X, map] = imread('indexed.png');
% RGB图像
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
1.3 保存图像 #
matlab
% 保存图像
imwrite(img, 'output.jpg');
imwrite(img, 'output.png');
imwrite(img, 'output.jpg', 'Quality', 95);
二、图像增强 #
2.1 对比度调整 #
matlab
% 直方图均衡化
img_eq = histeq(gray);
% 自适应直方图均衡化
img_adapteq = adapthisteq(gray);
% 对比度拉伸
img_stretch = imadjust(gray, [0.2 0.8], []);
% 显示直方图
imhist(gray);
2.2 亮度调整 #
matlab
% 伽马校正
img_gamma = imadjust(gray, [], [], 0.5);
% 对数变换
img_log = log(1 + double(gray));
% 幂次变换
img_power = double(gray).^0.5;
2.3 颜色处理 #
matlab
% RGB到其他颜色空间
hsv = rgb2hsv(img);
lab = rgb2lab(img);
ycbcr = rgb2ycbcr(img);
% 颜色分割
red_mask = img(:,:,1) > 200 & img(:,:,2) < 50 & img(:,:,3) < 50;
三、图像滤波 #
3.1 平滑滤波 #
matlab
% 均值滤波
h = fspecial('average', [5 5]);
img_blur = imfilter(gray, h);
% 高斯滤波
h = fspecial('gaussian', [5 5], 2);
img_gaussian = imfilter(gray, h);
% 中值滤波
img_median = medfilt2(gray, [5 5]);
3.2 锐化滤波 #
matlab
% 拉普拉斯锐化
h = fspecial('laplacian', 0.5);
img_sharp = gray - imfilter(gray, h);
% Unsharp masking
h = fspecial('unsharp');
img_unsharp = imfilter(gray, h);
3.3 边缘检测 #
matlab
% Sobel边缘
edges = edge(gray, 'sobel');
% Canny边缘
edges = edge(gray, 'canny');
% Prewitt边缘
edges = edge(gray, 'prewitt');
% Roberts边缘
edges = edge(gray, 'roberts');
% LoG边缘
edges = edge(gray, 'log');
四、形态学操作 #
4.1 基本操作 #
matlab
% 创建结构元素
se = strel('disk', 5);
se = strel('square', 5);
% 膨胀
img_dilate = imdilate(bw, se);
% 腐蚀
img_erode = imerode(bw, se);
% 开运算
img_open = imopen(bw, se);
% 闭运算
img_close = imclose(bw, se);
4.2 高级操作 #
matlab
% 形态学梯度
img_grad = imgradient(bw, se);
% 顶帽变换
img_tophat = imtophat(gray, se);
% 底帽变换
img_bothat = imbothat(gray, se);
% 骨架化
img_skeleton = bwmorph(bw, 'skel', Inf);
% 细化
img_thin = bwmorph(bw, 'thin', Inf);
五、图像分割 #
5.1 阈值分割 #
matlab
% 全局阈值
level = graythresh(gray);
bw = imbinarize(gray, level);
% 自适应阈值
bw = imbinarize(gray, 'adaptive');
% Otsu方法
level = graythresh(gray);
bw = imbinarize(gray, level);
5.2 区域分割 #
matlab
% 区域生长
bw = imbinarize(gray);
bw_fill = imfill(bw, 'holes');
% 连通区域
[labeled, num] = bwlabel(bw);
stats = regionprops(labeled, 'Area', 'Centroid');
% 分水岭分割
D = -bwdist(~bw);
L = watershed(D);
5.3 颜色分割 #
matlab
% 使用颜色空间
hsv = rgb2hsv(img);
hue = hsv(:,:,1);
mask = hue > 0.9 | hue < 0.1; % 红色区域
六、图像变换 #
6.1 几何变换 #
matlab
% 缩放
img_scaled = imresize(img, 0.5);
img_scaled = imresize(img, [256 256]);
% 旋转
img_rotated = imrotate(img, 45);
% 翻转
img_flip_h = flip(img, 2); % 水平翻转
img_flip_v = flip(img, 1); % 垂直翻转
% 裁剪
img_crop = imcrop(img, [100 100 200 200]);
6.2 仿射变换 #
matlab
% 创建变换矩阵
tform = affine2d([1 0 0; 0.5 1 0; 0 0 1]);
img_transformed = imwarp(img, tform);
% 平移
tform = translate2d([50, 100]);
% 缩放
tform = scale2d([0.5, 0.5]);
七、特征检测 #
7.1 角点检测 #
matlab
% Harris角点
corners = detectHarrisFeatures(gray);
imshow(gray); hold on;
plot(corners);
% FAST角点
corners = detectFASTFeatures(gray);
7.2 斑点检测 #
matlab
% 检测斑点
blobs = detectBlob(gray);
imshow(gray); hold on;
plot(blobs);
7.3 SURF特征 #
matlab
% SURF特征点
points = detectSURFFeatures(gray);
[features, valid_points] = extractFeatures(gray, points);
% 特征匹配
points1 = detectSURFFeatures(gray1);
points2 = detectSURFFeatures(gray2);
[features1, valid_points1] = extractFeatures(gray1, points1);
[features2, valid_points2] = extractFeatures(gray2, points2);
indexPairs = matchFeatures(features1, features2);
matchedPoints1 = valid_points1(indexPairs(:, 1));
matchedPoints2 = valid_points2(indexPairs(:, 2));
八、实用示例 #
8.1 图像去噪 #
matlab
% 读取含噪图像
img = imread('noisy.png');
gray = rgb2gray(img);
% 高斯滤波
h = fspecial('gaussian', [5 5], 1.5);
denoised = imfilter(gray, h);
% 中值滤波(对椒盐噪声更有效)
denoised_median = medfilt2(gray, [3 3]);
% 显示结果
subplot(1, 3, 1); imshow(gray); title('原图');
subplot(1, 3, 2); imshow(denoised); title('高斯滤波');
subplot(1, 3, 3); imshow(denoised_median); title('中值滤波');
8.2 目标计数 #
matlab
% 读取图像
img = imread('objects.png');
gray = rgb2gray(img);
% 二值化
bw = imbinarize(gray);
% 填充孔洞
bw_fill = imfill(bw, 'holes');
% 连通区域标记
[labeled, num] = bwlabel(bw_fill);
% 获取属性
stats = regionprops(labeled, 'Area', 'Centroid', 'BoundingBox');
% 显示结果
imshow(img); hold on;
for i = 1:num
rectangle('Position', stats(i).BoundingBox, ...
'EdgeColor', 'r', 'LineWidth', 2);
end
fprintf('检测到 %d 个目标\n', num);
九、总结 #
本章学习了:
- 图像基础:读取、显示、保存
- 图像增强:对比度、亮度调整
- 图像滤波:平滑、锐化、边缘检测
- 形态学操作:膨胀、腐蚀、开闭运算
- 图像分割:阈值、区域分割
- 图像变换:几何变换、仿射变换
- 特征检测:角点、斑点、SURF
下一章将学习优化工具。
最后更新:2026-03-27