文档

计算大图像的统计信息

这个例子展示了如何使用blockproc从大图像中计算统计信息,然后使用该信息更准确地按块处理图像。的blockproc函数非常适合于对图像逐块应用操作、组合结果并将其作为新图像返回。然而,许多图像处理算法需要关于图像的“全局”信息,当您一次只考虑一个图像数据块时,这是不可用的。当处理大到无法完全加载到内存中的图像时,这些约束可能会产生问题。

方法中的任务类似于此示例执行的任务增强多光谱彩色合成图像示例,但适用于大图像使用blockproc.您将增强Erdas LAN文件的可见波段rio.lan.这些类型的块处理技术通常对大图像更有用,但小图像也适用于本例的目的。

步骤1:构造一个真彩色合成

使用blockproc,从中读取数据rio.lan,该文件以Erdas LAN文件格式载有Landsat专题制图器图像。blockproc内置只支持读取TIFF和J万博1manbetxPEG2000文件。要读取其他类型的文件,必须编写一个Image Adapter类来支持特定文件格式的I/O。万博1manbetx这个示例使用一个预先构建的图像适配器类LanAdapter,支持读取局域网万博1manbetx文件。有关编写映像适配器类的更多信息,请参见用户指南中的教程描述如何LanAdapter阶级建立了。

Erdas LAN格式分别包含波段3、2和1中的可见红、绿和蓝光谱。使用blockproc将可见光波段提取到RGB图像中。

创建与rio.lan关联的LanAdapter对象。input_adapter = LanAdapter(“rio.lan”);%选择可见的R、G、B波段。input_adapter。SelectedBands = [3 2 1];创建一个块函数,简单地返回块数据不变。identityFcn = @(block_struct) block_struct.data;创建初始的真彩色图像。truecololor = blockproc(input_adapter,[100 100],identityFcn);显示未增强的结果。图;imshow(真彩);标题(“真彩色合成(未增强)”);

产生的真彩色图像类似于paris.lan增强多光谱彩色合成图像的例子。RGB图像看起来很暗,对比度很小。

第二步:增强图像-第一次尝试

首先,尝试在动态范围内使用blockproc.第一次尝试只是定义了一个新的函数句柄stretchlim而且imadjust在每个数据块上。

调整fcn = @(block_struct)...stretchlim (block_struct.data));truecolor_enhanced = blockproc(input_adapter,[100 100],adjustFcn);图imshow(truecolor_enhanced)“真彩色复合材料与块状对比拉伸”

你可以马上看出结果是不正确的。问题是stretchlim函数计算输入图像上的直方图,并使用此信息计算拉伸极限。由于每个块都是独立于其邻居进行调整的,因此每个块计算的限制都不同于其本地直方图。

步骤3:检查直方图累加器类

要检查图像动态范围内的数据分布,可以为三个可见波段中的每一个计算直方图。

当处理足够大的图像时,不能简单地调用imhist创建图像直方图。增量构建直方图的一种方法是使用blockproc使用一个类,当你在图像上移动时,它会对每个块的直方图进行求和。

检查HistogramAccumulator类。

类型HistogramAccumulator
直方图增量累加。% HistogramAccumulator是一个为图像增量建立%直方图的类。该类适用于8位%或16位整数图像,仅用于教学目的。The MathWorks, Inc. classdef HistogramAccumulator <句柄属性直方图范围结束方法函数obj = HistogramAccumulator() obj。Range = [];obj。直方图= [];结束函数addToHistogram(obj,new_data)如果是空的(obj. histogram) obj.直方图Range = double(0:intmax(class(new_data)));obj。直方图= hist(double(new_data(:)),obj.Range);else new_hist = hist(double(new_data(:)),obj.Range); obj.Histogram = obj.Histogram + new_hist; end end end end

类的简单包装器函数,允许您增量地向直方图添加数据。它不是特定的blockproc.观察下面的简单使用方法HistogramAccumulator类。

创建HistogramAccumulator对象。hist_obj = HistogramAccumulator();将样本图像分成两部分。Full_image = imread(“liftingbody.png”);Top_half = full_image(1:256,:);Bottom_half = full_image(257:end,:);增量计算直方图。addToHistogram (hist_obj top_half);addToHistogram (hist_obj bottom_half);computed_histogram = hist_obj.Histogram;%与IMHIST的结果进行比较。Normal_histogram = imhist(full_image);检查结果。直方图在数字上是相同的。图次要情节(1、2、1);茎(computed_histogram“标记”“没有”);标题(“增量计算直方图”);次要情节(1、2、2);茎(normal_histogram ',“标记”“没有”);标题(“IMHIST直方图”);

步骤4:使用BLOCKPROC的HistogramAccumulator类

现在使用HistogramAccumulatorblockproc建立红色波段数据的直方图rio.lan.的函数句柄blockproc将调用addToHistogram方法。通过查看此直方图,您可以看到数据集中在可用动态范围的一小部分。其他可见波段也有类似的分布。这就是为什么原来的真彩色合成物显得沉闷的原因之一。

创建HistogramAccumulator对象。hist_obj = HistogramAccumulator();设置blockproc函数句柄addToHistFcn = @(block_struct) addToHistogram(hist_obj, block_struct.data);计算红色通道的直方图。注意,addToHistFcn函数句柄不会生成任何输出。由于函数句柄我们%是传递给blockproc不返回任何东西,blockproc不会%返回任何东西。input_adapter。SelectedBands = 3;blockproc (input_adapter (100 100), addToHistFcn);red_hist = hist_obj.Histogram;显示结果。图阻止(red_hist,“标记”“没有”);标题(红色波段直方图(波段3));

步骤5:用对比度拉伸增强真彩色合成

现在可以在图像上执行适当的对比度拉伸。对于常规的内存工作流,可以简单地使用stretchlim函数来计算参数imadjust(如MultispectralImageEnhancementExample的例子。当处理大图像时,正如我们所看到的,stretchlim不容易适应使用blockproc因为它依赖于完整的图像直方图。

一旦你计算了每个可见波段的图像直方图,计算适当的参数imadjust手工(类似于如何stretchlim做)。

首先计算绿色和蓝色波段的直方图。

计算绿色通道的直方图。hist_obj = HistogramAccumulator();addToHistFcn = @(block_struct) addToHistogram(hist_obj, block_struct.data);input_adapter。SelectedBands = 2;blockproc (input_adapter (100 100), addToHistFcn);green_hist = hist_obj.Histogram;计算蓝色通道的直方图。hist_obj = HistogramAccumulator();addToHistFcn = @(block_struct) addToHistogram(hist_obj, block_struct.data);input_adapter。SelectedBands = 1;blockproc (input_adapter (100 100), addToHistFcn);blue_hist = hist_obj.Histogram;

现在计算每个直方图的CDF并准备调用imadjust

computeCDF = @(直方图)cumsum(直方图)/ sum(直方图);findLowerLimit = @(cdf) find(cdf > 0.01, 1,“第一”);find(cdf >= 0.99, 1,)“第一”);red_cdf = computeCDF(red_hist);red_limits(1) = findLowerLimit(red_cdf);red_limits(2) = findUpperLimit(red_cdf);green_cdf = computeCDF(green_hist);green_limits(1) = findLowerLimit(green_cdf);green_limits(2) = findUpperLimit(green_cdf);blue_cdf = computeCDF(blue_hist);blue_limits(1) = findLowerLimit(blue_cdf);blue_limits(2) = findUpperLimit(blue_cdf);为IMADJUST准备参数。Rgb_limits = [red_limits' green_limits' blue_limits'];%缩放到[0,1]范围。Rgb_limits = (Rgb_limits - 1) / (255);

创建一个新的adjustFcn应用全局拉伸限制和使用blockproc调整真彩色图像。

调整fcn = @(block_struct) imadjust(block_struct.data,rgb_limits);%选择RGB全量数据。input_adapter。SelectedBands = [3 2 1];truecolor_enhanced = blockproc(input_adapter,[100 100],adjustFcn);图;imshow (truecolor_enhanced)标题(“校正对比度拉伸的真彩色复合材料”

结果图像得到了很大的改善,数据覆盖了更多的动态范围,并通过使用blockproc您可以避免将整个图像加载到内存中。

这个话题有用吗?