如何在 Matlab 中对图像进行重新分类?
How to reclassify images in Matlab?
我正在尝试使用 Matlab 将连续数据重新分类为分类数据。以下脚本采用 4 波段(红、绿、蓝、nIR)航拍图像并计算归一化差异植被指数(即显示健康绿色植被的植被指数)。然后脚本将值从(-1 到 1)重新调整为(0 - 255)。这是我在脚本 %% Reclassify Imag1 matrix
的第三部分中尝试重新分类的矩阵。我正在尝试使用条件语句来执行重新分类,尽管这可能是错误的方法。脚本中的重分类步骤没有任何明显效果。
如何在逐个单元格的基础上将连续值 (0 - 255) 重新分类为分类值 (1, 2, 3, 4)?
file = 'F:\path\to\naip\image12107_ne.tif';
[Z R] = geotiffread(file);
outputdir = 'F:\temp\';
%% Make NDVI calculations
NIR = im2single(Z(:,:,4));
red = im2single(Z(:,:,3));
ndvi = (NIR - red) ./ (NIR + red);
ndvi = double(ndvi);
%% Stretch NDVI to 0-255 and convert to 8-bit unsigned integer
ndvi = floor((ndvi + 1) * 128); % [-1 1] -> [0 256]
ndvi(ndvi < 0) = 0; % not really necessary, just in case & for symmetry
ndvi(ndvi > 255) = 255; % in case the original value was exactly 1
Imag1 = uint8(ndvi);
%% Reclassify Imag1 matrix
if (150 <= Imag1)
Imag1 = 1;
elseif (150 > Imag1) & (140 < Imag1)
Imag1 = 2;
elseif (140 > Imag1) & (130 < Imag1)
Imag1 = 3;
elseif (130 >= Imag1)
Imag1 = 4;
end
%% Write the results to disk
tiffdata = geotiffinfo(file);
outfilename = [outputdir 'reclass_ndvi' '.tif'];
geotiffwrite(outfilename, Imag1, R, 'GeoKeyDirectoryTag', tiffdata.GeoTIFFTags.GeoKeyDirectoryTag)
disp('Processing complete')
试试这个:
Imag1 = [ 62 41 169 118 210;
133 158 96 149 110;
211 200 84 194 29;
209 16 15 146 28;
95 144 13 249 170];
Imag1(find(Imag1 <= 130)) = 4;
Imag1(find(Imag1 >= 150)) = 1;
Imag1(find(Imag1 > 140)) = 2;
Imag1(find(Imag1 > 130)) = 3;
结果:
Imag1 =
62 41 169 118 210
133 158 96 149 110
211 200 84 194 29
209 16 15 146 28
95 144 13 249 170
Imag1 =
4 4 1 4 1
3 1 4 2 4
1 1 4 1 4
1 4 4 2 4
4 2 4 1 1
如果你愿意,我可以详细介绍逻辑,但我想先确认这是否给出了你预期的结果。
根据 上的注释进行了一些更新,以消除不必要的 find
并使代码更健壮且独立于执行顺序。
Imag2 = zeros(size(Imag1));
Imag2(Imag1 >= 150) = 1;
Imag2((Imag1 > 140) & (Imag1 < 150)) = 2;
Imag2((Imag1 > 130) & (Imag1 < 141)) = 3;
Imag2(Imag1 <= 130) = 4;
请注意,结果现在位于 Imag2
而不是覆盖 Imag1
。
我正在尝试使用 Matlab 将连续数据重新分类为分类数据。以下脚本采用 4 波段(红、绿、蓝、nIR)航拍图像并计算归一化差异植被指数(即显示健康绿色植被的植被指数)。然后脚本将值从(-1 到 1)重新调整为(0 - 255)。这是我在脚本 %% Reclassify Imag1 matrix
的第三部分中尝试重新分类的矩阵。我正在尝试使用条件语句来执行重新分类,尽管这可能是错误的方法。脚本中的重分类步骤没有任何明显效果。
如何在逐个单元格的基础上将连续值 (0 - 255) 重新分类为分类值 (1, 2, 3, 4)?
file = 'F:\path\to\naip\image12107_ne.tif';
[Z R] = geotiffread(file);
outputdir = 'F:\temp\';
%% Make NDVI calculations
NIR = im2single(Z(:,:,4));
red = im2single(Z(:,:,3));
ndvi = (NIR - red) ./ (NIR + red);
ndvi = double(ndvi);
%% Stretch NDVI to 0-255 and convert to 8-bit unsigned integer
ndvi = floor((ndvi + 1) * 128); % [-1 1] -> [0 256]
ndvi(ndvi < 0) = 0; % not really necessary, just in case & for symmetry
ndvi(ndvi > 255) = 255; % in case the original value was exactly 1
Imag1 = uint8(ndvi);
%% Reclassify Imag1 matrix
if (150 <= Imag1)
Imag1 = 1;
elseif (150 > Imag1) & (140 < Imag1)
Imag1 = 2;
elseif (140 > Imag1) & (130 < Imag1)
Imag1 = 3;
elseif (130 >= Imag1)
Imag1 = 4;
end
%% Write the results to disk
tiffdata = geotiffinfo(file);
outfilename = [outputdir 'reclass_ndvi' '.tif'];
geotiffwrite(outfilename, Imag1, R, 'GeoKeyDirectoryTag', tiffdata.GeoTIFFTags.GeoKeyDirectoryTag)
disp('Processing complete')
试试这个:
Imag1 = [ 62 41 169 118 210;
133 158 96 149 110;
211 200 84 194 29;
209 16 15 146 28;
95 144 13 249 170];
Imag1(find(Imag1 <= 130)) = 4;
Imag1(find(Imag1 >= 150)) = 1;
Imag1(find(Imag1 > 140)) = 2;
Imag1(find(Imag1 > 130)) = 3;
结果:
Imag1 =
62 41 169 118 210
133 158 96 149 110
211 200 84 194 29
209 16 15 146 28
95 144 13 249 170
Imag1 =
4 4 1 4 1
3 1 4 2 4
1 1 4 1 4
1 4 4 2 4
4 2 4 1 1
如果你愿意,我可以详细介绍逻辑,但我想先确认这是否给出了你预期的结果。
根据 find
并使代码更健壮且独立于执行顺序。
Imag2 = zeros(size(Imag1));
Imag2(Imag1 >= 150) = 1;
Imag2((Imag1 > 140) & (Imag1 < 150)) = 2;
Imag2((Imag1 > 130) & (Imag1 < 141)) = 3;
Imag2(Imag1 <= 130) = 4;
请注意,结果现在位于 Imag2
而不是覆盖 Imag1
。