bwlookup
Nonlinear filtering using lookup tables
Syntax
Description
performs a 2-by-2 or 3-by-3 nonlinear neighborhood filtering operation on binary image
J
= bwlookup(BW
,lut
)BW
. The neighborhood processing determines an integer index value
used to access values in lookup table lut
. The fetched
lut
value becomes the pixel value in output image
J
at the targeted position.
Examples
Perform Erosion Along Edges of Binary Image
Construct the vector lut
such that the filtering operation places a 1
at the targeted pixel location in the input image only when all four pixels in the 2-by-2 neighborhood of BW are set to 1
.
lutfun = @(x)(sum(x(:))==4); lut = makelut(lutfun,2)
lut = 16×1
0
0
0
0
0
0
0
0
0
0
⋮
Load a binary image.
BW1 = imread('text.png');
Perform 2-by-2 neighborhood processing with 16-element vector lut
.
BW2 = bwlookup(BW1,lut);
Show zoomed before and after images.
figure; h1 = subplot(1,2,1); imshow(BW1), axis off; title('Original Image') h2 = subplot(1,2,2); imshow(BW2); axis off; title('Eroded Image') % 16X zoom to see effects of erosion on text set(h1,'Ylim',[1 64],'Xlim',[1 64]); set(h2,'Ylim',[1 64],'Xlim',[1 64]);
Input Arguments
BW
— Binary image
2-D logical matrix | 2-D numeric matrix
Binary image to be transformed by the nonlinear neighborhood filtering operation,
specified as a 2-D logical matrix or 2-D numeric matrix. For numeric input,
any nonzero pixels are considered to be 1
(true
).
Data Types: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
lut
— Lookup table of output pixel values
16-element vector | 512-element vector
Lookup table of output pixel values, specified as a 16- or 512-element vector. The size of
lut
determines which of the two neighborhood operations is
performed. You can use the makelut
function to create a lookup
table.
If
lut
contains 16 data elements, then the neighborhood matrix is 2-by-2.If
lut
contains 512 data elements, then the neighborhood matrix is 3-by-3.
Data Types: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
Output Arguments
Algorithms
The first step in each iteration of the filtering operation performed by
bwlookup
entails computing the index
into vector
lut
based on the binary pixel pattern of the neighborhood matrix on
image BW
. The value in lut
accessed at
index
, lut(index)
, is inserted into output image
J
at the targeted pixel location. This results in image
J
being the same data type as vector lut
.
Since there is a 1-to-1 correspondence in targeted pixel locations, image
J
is the same size as image BW
. If the targeted
pixel location is on an edge of image BW
and if any part of the 2-by-2 or
3-by-3 neighborhood matrix extends beyond the image edge, then these non-image locations are
padded with 0 in order to perform the filtering operation.
The following figures show the mapping from binary 0 and 1 patterns
in the neighborhood matrices to its binary representation. Adding
1 to the binary representation yields index
which
is used to access lut
.
2-by-2 Neighborhood Lookup
For 2-by-2 neighborhoods, length(lut)
is 16. There are four pixels in
each neighborhood, and two possible states for each pixel, so the total number of
permutations is 24 = 16.
To illustrate, this example shows how the pixel pattern in a 2-by-2 matrix determines
which entry in lut
is placed in the targeted pixel location.
Create random 16-element
lut
vector containinguint8
data.scurr = rng; % save current random number generator seed state rng('default') % always generate same set of random numbers lut = uint8( round( 255*rand(16,1) ) ) % generate lut rng(scurr); % restore
lut = 208 231 32 233 161 25 71 139 244 246 40 248 244 124 204 36
Create a 2-by-2 image and assume for this example that the targeted pixel location is location
BW(1,1)
.BW = [1 0; 0 1]
BW = 1 0 0 1
By referring to the color coded mapping figure above, the binary representation for this 2-by-2 neighborhood can be computed as shown in the code snippet below. The logical 1 at
BW(1,1)
corresponds to blue in the figure which maps to the Least Significant Bit (LSB) at position 0 in the 4-bit binary representation (,20= 1). The logical 1 atBW(2,2)
is red which maps to the Most Significant Bit (MSB) at position 3 in the 4-bit binary representation (23= 8) .% BW(1,1): blue square; sets bit position 0 on right % BW(2,2): red square; sets bit position 3 on left binNot = '1 0 0 1'; % binary representation of 2x2 neighborhood matrix X = bin2dec( binNot ); % convert from binary to decimal index = X + 1 % add 1 to compute index value for uint8 vector lut A11 = lut(index) % value at A(1,1)
index = 10 A11 = 246
The above calculation predicts that output image A should contain the value 246 at targeted position
A(1,1)
.A = bwlookup(BW,lut) % perform filtering
A = 246 32 161 231
A(1,1)
does in fact equal 246.
3-by-3 Neighborhood Lookup
For 3-by-3 neighborhoods, length(lut)
is 512. There are nine pixels
in each neighborhood, and two possible states for each pixel, so the total number of
permutations is 29 = 512.
The process for computing the binary representation of 3-by-3 neighborhood processing is the same as for 2-by-2 neighborhoods.
Extended Capabilities
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
Usage notes and limitations:
bwlookup
supports the generation of C code (requires MATLAB® Coder™). Note that if you choose the genericMATLAB Host Computer
target platform,bwlookup
generates code that uses a precompiled, platform-specific shared library. Use of a shared library preserves performance optimizations but limits the target platforms for which code can be generated. For more information, see Types of Code Generation Support in Image Processing Toolbox.When generating code, specify an input image of class
logical
.
GPU Code Generation
Generate CUDA® code for NVIDIA® GPUs using GPU Coder™.
Usage notes and limitations:
When generating code, specify an input image of class
logical
.
Thread-Based Environment
Run code in the background using MATLAB® backgroundPool
or accelerate code with Parallel Computing Toolbox™ ThreadPool
.
This function fully supports thread-based environments. For more information, see Run MATLAB Functions in Thread-Based Environment.
GPU Arrays
Accelerate code by running on a graphics processing unit (GPU) using Parallel Computing Toolbox™.
This function fully supports GPU arrays. For more information, see Image Processing on a GPU.
Version History
Introduced in R2012bR2022b: Support for thread-based environments
bwlookup
now supports thread-based
environments.
See Also
Open Example
You have a modified version of this example. Do you want to open this example with your edits?
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)