MATLAB 计算 TIFF 格式图像均值

计算 TIFF 格式图像的均值,支持单帧/多帧、灰度/RGB、多波段等各种 TIFF 格式。


一、基础版本(单帧 TIFF 均值计算)

1.1 最简单直接的代码

matlab 复制代码
%% 计算单帧 TIFF 图像均值
clear; clc; close all;

% 读取 TIFF 图像
filename = 'your_image.tif';  % 替换为你的 TIFF 文件路径
img = imread(filename);

% 计算均值
if size(img, 3) == 1
    % 灰度图像
    mean_value = mean(img(:));
    fprintf('灰度图像均值: %.4f\n', mean_value);
else
    % RGB 彩色图像
    mean_r = mean(img(:,:,1));
    mean_g = mean(img(:,:,2));
    mean_b = mean(img(:,:,3));
    overall_mean = mean(img(:));
    
    fprintf('RGB 通道均值:\n');
    fprintf('  R通道: %.4f\n', mean_r);
    fprintf('  G通道: %.4f\n', mean_g);
    fprintf('  B通道: %.4f\n', mean_b);
    fprintf('整体均值: %.4f\n', overall_mean);
end

% 可视化
figure('Color','w');
imshow(img);
title(sprintf('TIFF 图像 (均值: %.2f)', mean(img(:))));

二、完整版本(支持多帧/多波段 TIFF)

2.1 主函数 tiff_mean_calculator.m

matlab 复制代码
%% TIFF 格式图像均值计算器(支持多帧/多波段)
clear; clc; close all;

%% ===== 1. 选择 TIFF 文件 =====
[filename, filepath] = uigetfile('*.tif;*.tiff', '选择 TIFF 图像文件');
if filename == 0
    disp('未选择文件,程序退出。');
    return;
end
fullpath = fullfile(filepath, filename);

%% ===== 2. 读取 TIFF 文件信息 =====
info = imfinfo(fullpath);
fprintf('TIFF 文件信息:\n');
fprintf('  文件名: %s\n', filename);
fprintf('  尺寸: %d × %d\n', info.Width, info.Height);
fprintf('  波段数: %d\n', info.SamplesPerPixel);
fprintf('  帧数: %d\n', info.NumberOfImages);
fprintf('  位深: %d bits\n', info.BitDepth);
fprintf('  数据类型: %s\n', info.ImageDescription);

%% ===== 3. 计算均值 =====
if info.NumberOfImages == 1
    % 单帧 TIFF
    img = imread(fullpath);
    calculate_single_frame_mean(img, filename);
else
    % 多帧 TIFF(如时间序列、Z-stack)
    calculate_multi_frame_mean(fullpath, info);
end

%% ===== 4. 批量处理文件夹中所有 TIFF =====
process_folder_option = questdlg('是否批量处理文件夹中的所有 TIFF 文件?', ...
                                 '批量处理', '是', '否', '否');
if strcmp(process_folder_option, '是')
    batch_process_tiff_files(filepath);
end

2.2 单帧均值计算函数

matlab 复制代码
function calculate_single_frame_mean(img, filename)
% 计算单帧 TIFF 图像的均值

fprintf('\n单帧 TIFF 均值计算:\n');

% 获取图像信息
[rows, cols, bands] = size(img);
total_pixels = rows * cols;

if bands == 1
    % 灰度图像
    mean_val = mean(img(:));
    median_val = median(img(:));
    std_val = std(double(img(:)));
    
    fprintf('  灰度图像:\n');
    fprintf('    均值: %.4f\n', mean_val);
    fprintf('    中位数: %.4f\n', median_val);
    fprintf('    标准差: %.4f\n', std_val);
    fprintf('    最小值: %d\n', min(img(:)));
    fprintf('    最大值: %d\n', max(img(:)));
    
    % 直方图
    figure('Color','w');
    subplot(1,2,1); imshow(img); title('原始图像');
    subplot(1,2,2); histogram(double(img(:)), 100);
    xlabel('灰度值'); ylabel('像素数');
    title(sprintf('灰度直方图 (均值=%.2f)', mean_val));
    grid on;
    
elseif bands == 3
    % RGB 彩色图像
    img_double = double(img);
    mean_r = mean(img_double(:,:,1));
    mean_g = mean(img_double(:,:,2));
    mean_b = mean(img_double(:,:,3));
    overall_mean = mean(img_double(:));
    
    fprintf('  RGB 彩色图像:\n');
    fprintf('    R通道均值: %.4f\n', mean_r);
    fprintf('    G通道均值: %.4f\n', mean_g);
    fprintf('    B通道均值: %.4f\n', mean_b);
    fprintf('    整体均值: %.4f\n', overall_mean);
    
    % 显示各通道均值
    figure('Color','w');
    subplot(2,2,1); imshow(img); title('原始图像');
    subplot(2,2,2); imshow(img(:,:,1)); title(sprintf('R通道 (均值=%.2f)', mean_r));
    subplot(2,2,3); imshow(img(:,:,2)); title(sprintf('G通道 (均值=%.2f)', mean_g));
    subplot(2,2,4); imshow(img(:,:,3)); title(sprintf('B通道 (均值=%.2f)', mean_b));
    
else
    % 多波段图像(如遥感影像)
    fprintf('  多波段图像 (%d 个波段):\n', bands);
    band_means = zeros(bands, 1);
    for b = 1:bands
        band_means(b) = mean(img(:,:,b));
        fprintf('    波段 %d: %.4f\n', b, band_means(b));
    end
    fprintf('    平均波段均值: %.4f\n', mean(band_means));
    
    % 显示假彩色合成
    if bands >= 3
        figure('Color','w');
        subplot(1,2,1); imshow(img(:,:,1:min(3,bands))); title('假彩色合成');
        subplot(1,2,2); bar(1:bands, band_means);
        xlabel('波段'); ylabel('均值'); title('各波段均值');
        grid on;
    end
end
end

2.3 多帧 TIFF 均值计算函数

matlab 复制代码
function calculate_multi_frame_mean(filepath, info)
% 计算多帧 TIFF 图像的均值

n_frames = info.NumberOfImages;
fprintf('\n多帧 TIFF 均值计算 (%d 帧):\n', n_frames);

% 读取所有帧并计算均值
frame_means = zeros(n_frames, 1);
frame_sizes = zeros(n_frames, 2);

for i = 1:n_frames
    img = imread(filepath, i);
    frame_means(i) = mean(img(:));
    frame_sizes(i, :) = [size(img,1), size(img,2)];
    
    fprintf('  第 %d 帧: %.4f (尺寸: %d×%d)\n', ...
            i, frame_means(i), frame_sizes(i,1), frame_sizes(i,2));
end

% 计算统计量
overall_mean = mean(frame_means);
std_mean = std(frame_means);
min_mean = min(frame_means);
max_mean = max(frame_means);

fprintf('\n多帧统计:\n');
fprintf('  平均均值: %.4f\n', overall_mean);
fprintf('  标准差: %.4f\n', std_mean);
fprintf('  最小值: %.4f\n', min_mean);
fprintf('  最大值: %.4f\n', max_mean);

% 可视化
figure('Color','w');
subplot(2,1,1);
plot(1:n_frames, frame_means, 'bo-', 'LineWidth', 1.5);
xlabel('帧序号'); ylabel('均值');
title('各帧均值变化');
grid on;

subplot(2,1,2);
histogram(frame_means, 20, 'Normalization', 'probability');
xlabel('均值'); ylabel('概率');
title(sprintf('均值分布 (μ=%.2f, σ=%.2f)', overall_mean, std_mean));
grid on;
end

2.4 批量处理文件夹中所有 TIFF

matlab 复制代码
function batch_process_tiff_files(folderpath)
% 批量处理文件夹中的所有 TIFF 文件

files = dir(fullfile(folderpath, '*.tif'));
if isempty(files)
    files = dir(fullfile(folderpath, '*.tiff'));
end

if isempty(files)
    disp('文件夹中没有 TIFF 文件。');
    return;
end

fprintf('\n批量处理 %d 个 TIFF 文件:\n', length(files));

% 存储结果
results = struct('filename', {}, 'mean', {}, 'size', {});

for i = 1:length(files)
    filename = files(i).name;
    filepath = fullfile(folderpath, filename);
    
    fprintf('  处理: %s\n', filename);
    img = imread(filepath);
    mean_val = mean(img(:));
    img_size = [size(img,1), size(img,2)];
    
    results(i).filename = filename;
    results(i).mean = mean_val;
    results(i).size = img_size;
end

% 显示汇总结果
fprintf('\n批量处理结果汇总:\n');
fprintf('%-30s %-15s %-15s\n', '文件名', '均值', '尺寸');
fprintf('%-30s %-15s %-15s\n', '---', '---', '---');
for i = 1:length(results)
    fprintf('%-30s %-15.4f %-15s\n', ...
            results(i).filename, results(i).mean, ...
            sprintf('%d×%d', results(i).size(1), results(i).size(2)));
end

% 绘制汇总图
figure('Color','w');
subplot(1,2,1);
bar(1:length(results), [results.mean]);
xlabel('文件序号'); ylabel('均值');
title('批量处理均值对比');
xticks(1:length(results));
xticklabels({results.filename});
xtickangle(45);
grid on;

subplot(1,2,2);
means = [results.mean];
boxplot(means);
ylabel('均值');
title('均值分布箱线图');
grid on;

% 保存结果
save('tiff_batch_results.mat', 'results');
fprintf('\n结果已保存到 tiff_batch_results.mat\n');
end

三、特殊 TIFF 格式处理

3.1 16-bit / 32-bit TIFF 处理

matlab 复制代码
%% 处理高比特深度 TIFF
img = imread('high_bit_depth.tif');

% 检查数据类型
disp(['数据类型: ' class(img)]);

% 转换为 double 并计算均值
if isinteger(img)
    img_double = double(img);
    mean_val = mean(img_double(:));
    fprintf('高比特深度图像均值: %.4f\n', mean_val);
    
    % 归一化到 0-1 范围
    if isa(img, 'uint16')
        img_normalized = img_double / 65535;
    elseif isa(img, 'uint32')
        img_normalized = img_double / 4294967295;
    end
    fprintf('归一化后均值: %.4f\n', mean(img_normalized(:)));
end

3.2 地理 TIFF(GeoTIFF)处理

matlab 复制代码
%% 处理 GeoTIFF(带地理信息)
[img, geoinfo] = geotiffread('geographic.tif');

fprintf('GeoTIFF 信息:\n');
fprintf('  投影: %s\n', geoinfo.ProjectedCRS.Name);
fprintf('  分辨率: %.2f m/pixel\n', geoinfo.CellExtentInWorldX);

% 计算有效区域均值(排除 NoData 值)
if isfield(geoinfo, 'MissingDataValue')
    nodata = geoinfo.MissingDataValue;
    valid_mask = img ~= nodata;
    valid_mean = mean(img(valid_mask));
    fprintf('有效区域均值: %.4f\n', valid_mean);
else
    fprintf('整体均值: %.4f\n', mean(img(:)));
end

四、运行说明

4.1 直接运行

  1. 将代码保存为 tiff_mean_calculator.m
  2. 运行脚本
  3. 选择你的 TIFF 文件

4.2 命令行快速计算

matlab 复制代码
% 一行代码计算 TIFF 均值
mean_val = mean(imread('your_image.tif')(:));
fprintf('TIFF 图像均值: %.4f\n', mean_val);

4.3 常见 TIFF 格式支持

TIFF 类型 支持情况 处理方式
灰度 TIFF ✅ 完全支持 直接计算
RGB TIFF ✅ 完全支持 分通道计算
多波段 TIFF ✅ 完全支持 逐波段计算
多帧 TIFF ✅ 完全支持 逐帧计算
16-bit TIFF ✅ 完全支持 自动转换
GeoTIFF ✅ 完全支持 支持地理信息

五、工程应用建议

5.1 质量控制

matlab 复制代码
% 检查图像质量
function check_image_quality(img)
    mean_val = mean(img(:));
    std_val = std(double(img(:)));
    snr = mean_val / std_val;
    
    fprintf('图像质量评估:\n');
    fprintf('  均值: %.4f\n', mean_val);
    fprintf('  信噪比: %.2f\n', snr);
    
    if snr < 2
        fprintf('  警告: 信噪比较低!\n');
    end
end

5.2 批量处理脚本

matlab 复制代码
% 批量计算文件夹中所有 TIFF 的均值并保存 CSV
folder = 'C:\images\';
files = dir(fullfile(folder, '*.tif'));
results = table();

for i = 1:length(files)
    img = imread(fullfile(folder, files(i).name));
    results.FileName{i} = files(i).name;
    results.Mean(i) = mean(img(:));
    results.Size(i) = size(img,1) * size(img,2);
end

writetable(results, 'tiff_means.csv');
fprintf('结果已保存到 tiff_means.csv\n');

参考代码 matlab用于计算tif格式图像均值 www.youwenfan.com/contentcsw/82073.html

六、故障排除

问题 解决方法
无法读取 TIFF 检查文件路径是否正确,文件是否损坏
内存不足 使用 imread 的分块读取功能,或降低图像分辨率
均值异常 检查是否为 16-bit 图像,可能需要归一化
多波段混乱 明确指定波段顺序,或使用 geotiffread