文档

bwlookup

使用查找表进行非线性过滤

语法

A = bwlookup(BW,lut)
gpuarrayA = bwlookup(gpuarrayBW,lut)

描述

例子

一个= bwlookup (BW附近地区对二值或灰度图像执行2 × 2或3 × 3非线性邻域滤波操作BW并在输出图像中返回结果一个.邻域处理确定用于访问查找表中的值的整型索引值附近地区.所获取的附近地区value成为输出图像A中目标位置的像素值。

  • 一个尺寸和BW

  • 一个是相同的数据类型附近地区

gpuarrayA= bwlookup (gpuarrayBW附近地区对图形处理器进行过滤操作。输入图像和输出图像是gpuArray年代。附近地区可以是数字还是gpuArray向量。此语法需要并行计算工具箱™。

例子

全部折叠

构造向量附近地区这样,过滤操作放置一个1只有当BW的2 × 2邻域中的所有4个像素都设置为时,才能在输入图像中的目标像素位置1

Lutfun = @(x)(sum(x(:))==4);Lut = makelut(lutfun,2)
附近地区=16×10 0 0 0 0 0 0 0 0 0 0 0 ` `

加载一个二值图像。

BW1 = imread(“text.png”);

使用16元素向量执行2 × 2邻域处理附近地区

BW2 = bwlookup(BW1,lut);

Show将图像前后进行缩放。

图;H1 = subplot(1,2,1);imshow (BW1),轴;标题(原始图像的) h2 = subplot(1,2,2);imshow (BW2);轴;标题(“侵蚀形象”% 16X放大查看侵蚀对文本的影响集(h1,“Ylim”64年[1],“Xlim”64年[1]);集(h2,“Ylim”64年[1],“Xlim”64年[1]);

使用2 × 2邻域沿二值图像的边缘执行侵蚀,在图形处理单元(GPU)上运行代码。

构造附近地区所以只有当4个2 × 2的位置都等于1时它才成立

Lut = makelut(的总和(x (:)) = = 4 '2);

加载二值图像。

BW1 = imread(“text.png”);

使用16元素矢量LUT执行2 × 2邻域处理。要在GPU上运行代码,请创建gpuArray用于包含图像。

BW2 = bwlookup(gpuArray(BW1),lut);

Show将图像前后进行缩放。

图;H1 = subplot(1,2,1);imshow (BW1),轴;标题(“BW1”) h2 = subplot(1,2,2);imshow (BW2);轴;标题(“BW2”% 16X放大查看侵蚀对文本的影响集(h1,“Ylim”,(。5 64.5]);集(h1,“Xlim”,(。5 64.5]);集(h2,“Ylim”,(。5 64.5]);集(h2,“Xlim”,(。5 64.5]);

输入参数

全部折叠

输入图像转换为非线性邻域滤波操作,指定为灰度或二值(逻辑)图像。在数值的情况下,非零像素被考虑真正的这相当于逻辑1。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑

在GPU上处理的输入图像,指定为gpuArray包含二值图像的。

输出像素值的查找表,指定为16或512个元素向量。的大小附近地区确定执行两个邻域操作中的哪一个。

  • 如果附近地区包含16个数据元素,则邻域矩阵为2 × 2。

  • 如果附近地区包含512个数据元素,则邻域矩阵为3 × 3。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑

输出参数

全部折叠

输出图像,作为大小匹配的灰度或二值图像返回BW,其像素值的分布由的内容决定附近地区

  • 一个尺寸和BW

  • 一个是相同的数据类型附近地区

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑

输出图像,返回为gpuArray包含灰度或二值图像的。

算法

由所执行的筛选操作的每次迭代中的第一步bwlookup需要计算指数为向量附近地区基于图像上邻域矩阵的二值像素模式BW.的价值附近地区在访问指数附近地区(索引),插入到输出图像中一个在目标像素位置。这就产生了图像一个是与vector相同的数据类型附近地区

由于目标像素位置是一对一对应的,所以图像a与图像大小相同BW.如果目标像素位置在图像的边缘上BW如果2 × 2或3 × 3邻域矩阵的任何部分延伸到图像边缘之外,那么这些非图像位置将被填充为0,以便执行滤波操作。

下图显示了从邻域矩阵中的二进制0和1模式到其二进制表示的映射。在二进制表示中加上1得到指数哪些是用来访问的附近地区

对于2乘2的邻域,长度(附近地区)是16。每个邻域有四个像素,每个像素有两种可能的状态,所以排列的总数是24= 16。

为了说明这一点,这个示例展示了2 × 2矩阵中的像素模式如何确定在附近地区放在目标像素位置。

  1. 创建随机的16元素附近地区向量包含uint8数据。

    Scurr = rng;保存当前随机数生成器的种子状态rng (“默认”%总是生成相同的随机数集Lut = uint8(round(255*rand(16,1))))%生成lutrng (scurr);%恢复
    Lut = 208 231 32 233 161 25 71 139 244 246 40 248 244 124 204 36
  2. 创建一个2 × 2图像,并在本例中假设目标像素位置为locationBW (1, 1)

    Bw = [10 0;0 1]
    Bw = 1 0 0 1
  3. 通过参考上面的颜色编码映射图,可以计算这个2乘2邻域的二进制表示,如下面的代码片段所示。逻辑上的1BW (1, 1)对应于图中的蓝色,它映射到4位二进制表示(,2)中位置0的最低有效位(LSB)0= 1)BW (2, 2)是红色,它映射到4位二进制表示中位置3的最高有效位(MSB) (23.= 8)。

    % BW(1,1):蓝色方形;在右边设置位位0% BW(2,2):红方;在左侧设置位位3binNot ='1 0 0 1'2x2邻域矩阵的%二进制表示X = bin2dec(binNot);%从二进制转换为十进制index = X + 1%加1计算uint8矢量lut的指标值A11 = lut(指数)A(1,1)点的值%
    index = 10 A11 = 246
  4. 以上计算预测输出图像A在目标位置应包含246值(1)

    A = bwlookup(BW,lut)%执行过滤
    A = 246 32 161 231

    (1)实际上等于246。

请注意

有关执行图像侵蚀的更健壮的方法,请参见函数imerode

对于3乘3的社区,长度(附近地区)是512。每个邻域有9个像素,每个像素有两种可能的状态,所以排列的总数是29= 512。

计算3 × 3邻域处理的二进制表示的过程与上面2 × 2邻域的计算过程相同。

扩展功能

另请参阅

在R2012b中引入

这个话题有用吗?