You are here : matlab → Image Processing → multithresh
# multithresh() - Image Processing

### Syntax

### Example

### Output / Return Value

### Limitations

### Alternatives / See Also

### Reference

thresh = multithresh(A) returns the single threshold value thresh computed for image A using Otsu's method. You can use thresh as an input argument to imquantize to convert an image into a two-level image.examplethresh = multithresh(A,N) returns thresh a 1-by-N vector containing N threshold values using Otsu's method. You can use thresh as an input argument to imquantize to convert image A into an image with N + 1 discrete levels.example[thresh,metric] = multithresh(___) returns metric, a measure of the effectiveness of the computed thresholds. metric is in the range [0 1] and a higher value indicates greater effectiveness of the thresholds in separating the input image into N + 1 regions based on Otsu's objective criterion.Code Generation support: Yes.MATLAB Function Block support: Yes.

thresh = multithresh(A) examplethresh = multithresh(A,N) example[thresh,metric] = multithresh(___) example

Segment Image Into Two RegionsOpen This Example Read image and display it.I = imread('coins.png'); imshow(I) Calculate a single threshold value for the image.level = multithresh(I); Segment the image into two regions using imquantize , specifying the threshold level returned by multithresh .seg_I = imquantize(I,level); figure imshow(seg_I,[]) Segment Image into Three Levels Using Two ThresholdsOpen This Example Read image and display it.I = imread('circlesBrightDark.png'); imshow(I) axis off title('Original Image') Calculate two threshold levels.thresh = multithresh(I,2); Segment the image into three levels using imquantize .seg_I = imquantize(I,thresh); Convert segmented image into color image using label2rgb and display it.RGB = label2rgb(seg_I); figure; imshow(RGB) axis off title('RGB Segmented Image') Compare Thresholding Entire Image Versus Plane-by-Plane ThresholdingOpen This Example Read truecolor (RGB) image and display it.I = imread('peppers.png'); imshow(I) axis off title('RGB Image'); Generate thresholds for seven levels from the entire RGB image.threshRGB = multithresh(I,7); Generate thresholds for each plane of the RGB image.threshForPlanes = zeros(3,7); for i = 1:3 threshForPlanes(i,:) = multithresh(I(:,:,i),7); end Process the entire image with the set of threshold values computed from entire image.value = [0 threshRGB(2:end) 255]; quantRGB = imquantize(I, threshRGB, value); Process each RGB plane separately using the threshold vector computed from the given plane. Quantize each RGB plane using threshold vector generated for that plane.quantPlane = zeros( size(I) ); for i = 1:3 value = [0 threshForPlanes(i,2:end) 255]; quantPlane(:,:,i) = imquantize(I(:,:,i),threshForPlanes(i,:),value); end quantPlane = uint8(quantPlane); Display both posterized images and note the visual differences in the two thresholding schemes.imshowpair(quantRGB,quantPlane,'montage') axis off title('Full RGB Image Quantization Plane-by-Plane Quantization') To compare the results, calculate the number of unique RGB pixel vectors in each output image. Note that the plane-by-plane thresholding scheme yields about 23% more colors than the full RGB image scheme.dim = size( quantRGB ); quantRGBmx3 = reshape(quantRGB, prod(dim(1:2)), 3); quantPlanemx3 = reshape(quantPlane, prod(dim(1:2)), 3); colorsRGB = unique(quantRGBmx3, 'rows' ); colorsPlane = unique(quantPlanemx3, 'rows' ); disp(['Unique colors in RGB image : ' int2str(length(colorsRGB))]); disp(['Unique colors in Plane-by-Plane image : ' int2str(length(colorsPlane))]); Unique colors in RGB image : 188 Unique colors in Plane-by-Plane image : 231 Check Results Using the Metric Output ArgumentOpen This Example Read image.I = imread('circlesBrightDark.png'); Find all unique grayscale values in image.uniqLevels = unique(I(:)); disp(['Number of unique levels = ' int2str( length(uniqLevels) )]); Number of unique levels = 148 Compute a series of thresholds at monotonically increasing values of N.Nvals = [1 2 4 8]; for i = 1:length(Nvals) [thresh, metric] = multithresh(I, Nvals(i) ); disp(['N = ' int2str(Nvals(i)) ' | metric = ' num2str(metric)]); end N = 1 | metric = 0.54767 N = 2 | metric = 0.98715 N = 4 | metric = 0.99648 N = 8 | metric = 0.99902 Apply the set of 8 threshold values to obtain a 9-level segmentation using imquantize .seg_Neq8 = imquantize(I,thresh); uniqLevels = unique( seg_Neq8(:) ) uniqLevels = 1 2 3 4 5 6 7 8 9 Threshold the image using seg_Neq8 as an input to multithresh. Set N equal to 8, which is 1 less than the number of levels in this segmented image. multithresh returns a metric value of 1.[thresh, metric] = multithresh(seg_Neq8,8) thresh = Columns 1 through 7 1.8784 2.7882 3.6667 4.5451 5.4549 6.3333 7.2118 Column 8 8.1216 metric = 1 Threshold the image again, this time increasing the value of N by 1. This value now equals the number of levels in the image. Note how the input is degenerate because the number of levels in the image is too few for the number of requested thresholds. Hence, multithresh returns a metric value of 0.[thresh, metric] = multithresh(seg_Neq8,9) Warning: No solution exists because the number of unique levels in the image are too few to find 9 thresholds. Returning an arbitrarily chosen solution. thresh = 1 2 3 4 5 6 7 8 9 metric = 0