matlab 在图像处理中常用的函数使用(2)

来源:互联网 发布:nexus9跳过网络验证 编辑:程序博客网 时间:2024/06/07 06:39
<span style="font-size:18px;">%%% Identify individual blobs by seeing which pixels are connected to each other.% Each group of connected pixels will be given a label, a number, to identify it and distinguish it from the other blobs.% Do connected components labeling with either bwlabel() or bwconncomp().labeledImage = bwlabel(binaryImage, 8);     % Label each blob so we can make measurements of it% labeledImage is an integer-valued image where all pixels in the blobs have values of 1, or 2, or 3, or ... etc.subplot(3, 3, 4);imshow(labeledImage, []);  % Show the gray scale image.title('Labeled Image, from bwlabel()', 'FontSize', captionFontSize);% Let's assign each blob a different color to visually show the user the distinct blobs.coloredLabels = label2rgb (labeledImage, 'hsv', 'k', 'shuffle'); % pseudo random color labels% coloredLabels is an RGB image.  We could have applied a colormap instead (but only with R2014b and later)subplot(3, 3, 5);imshow(coloredLabels);axis image; % Make sure image is not artificially stretched because of screen's aspect ratio.caption = sprintf('Pseudo colored labels, from label2rgb().\nBlobs are numbered from top to bottom, then from left to right.');title(caption, 'FontSize', captionFontSize);%%% Get all the blob properties.  Can only pass in originalImage in version R2008a and later.blobMeasurements = regionprops(labeledImage, originalImage, 'all');numberOfBlobs = size(blobMeasurements, 1);% bwboundaries() returns a cell array, where each cell contains the row/column coordinates for an object in the image.% Plot the borders of all the coins on the original grayscale image using the coordinates returned by bwboundaries.subplot(3, 3, 6);imshow(originalImage);title('Outlines, from bwboundaries()', 'FontSize', captionFontSize); axis image; % Make sure image is not artificially stretched because of screen's aspect ratio.hold on;%%boundaries = bwboundaries(binaryImage);numberOfBoundaries = size(boundaries, 1);for k = 1 : numberOfBoundariesthisBoundary = boundaries{k};plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);endhold off;textFontSize = 14;% Used to control size of "blob number" labels put atop the image.labelShiftX = -7;% Used to align the labels in the centers of the coins.blobECD = zeros(1, numberOfBlobs);% Print header line in the command window.fprintf(1,'Blob #      Mean Intensity  Area   Perimeter    Centroid       Diameter\n');% Loop over all blobs printing their measurements to the command window.for k = 1 : numberOfBlobs           % Loop through all blobs.% Find the mean of each blob.  (R2008a has a better way where you can pass the original image% directly into regionprops.  The way below works for all versions including earlier versions.)thisBlobsPixels = blobMeasurements(k).PixelIdxList;  % Get list of pixels in current blob.meanGL = mean(originalImage(thisBlobsPixels)); % Find mean intensity (in original image!)meanGL2008a = blobMeasurements(k).MeanIntensity; % Mean again, but only for version >= R2008ablobArea = blobMeasurements(k).Area;% Get area.blobPerimeter = blobMeasurements(k).Perimeter;% Get perimeter.blobCentroid = blobMeasurements(k).Centroid;% Get centroid one at a timeblobECD(k) = sqrt(4 * blobArea / pi);% Compute ECD - Equivalent Circular Diameter.fprintf(1,'#%2d %17.1f %11.1f %8.1f %8.1f %8.1f % 8.1f\n', k, meanGL, blobArea, blobPerimeter, blobCentroid, blobECD(k));% Put the "blob number" labels on the "boundaries" grayscale image.text(blobCentroid(1) + labelShiftX, blobCentroid(2), num2str(k), 'FontSize', textFontSize, 'FontWeight', 'Bold');end% Now, I'll show you another way to get centroids.% We can get the centroids of ALL the blobs into 2 arrays,% one for the centroid x values and one for the centroid y values.allBlobCentroids = [blobMeasurements.Centroid];centroidsX = allBlobCentroids(1:2:end-1);centroidsY = allBlobCentroids(2:2:end);% Put the labels on the rgb labeled image also.subplot(3, 3, 5);for k = 1 : numberOfBlobs           % Loop through all blobs.text(centroidsX(k) + labelShiftX, centroidsY(k), num2str(k), 'FontSize', textFontSize, 'FontWeight', 'Bold');end%%% Now I'll demonstrate how to select certain blobs based using the ismember() function.% Let's say that we wanted to find only those blobs% with an intensity between 150 and 220 and an area less than 2000 pixels.% This would give us the three brightest dimes (the smaller coin type).allBlobIntensities = [blobMeasurements.MeanIntensity];allBlobAreas = [blobMeasurements.Area];% Get a list of the blobs that meet our criteria and we need to keep.% These will be logical indices - lists of true or false depending on whether the feature meets the criteria or not.% for example [1, 0, 0, 1, 1, 0, 1, .....].  Elements 1, 4, 5, 7, ... are true, others are false.allowableIntensityIndexes = (allBlobIntensities > 150) & (allBlobIntensities < 220);allowableAreaIndexes = allBlobAreas < 2000; % Take the small objects.% Now let's get actual indexes, rather than logical indexes, of the  features that meet the criteria.% for example [1, 4, 5, 7, .....] to continue using the example from above.keeperIndexes = find(allowableIntensityIndexes & allowableAreaIndexes);% Extract only those blobs that meet our criteria, and% eliminate those blobs that don't meet our criteria.% Note how we use ismember() to do this.  Result will be an image - the same as labeledImage but with only the blobs listed in keeperIndexes in it.keeperBlobsImage = ismember(labeledImage, keeperIndexes);% Re-label with only the keeper blobs kept.labeledDimeImage = bwlabel(keeperBlobsImage, 8);     % Label each blob so we can make measurements of it% Now we're done.  We have a labeled image of blobs that meet our specified criteria.subplot(3, 3, 7);imshow(labeledDimeImage, []);axis image;%%title('"Keeper" blobs (3 brightest dimes in a re-labeled image)', 'FontSize', captionFontSize);% Plot the centroids in the original image in the upper left.% Dimes will have a red cross, nickels will have a blue X.message = sprintf('Now I will plot the centroids over the original image in the upper left.\nPlease look at the upper left image.');reply = questdlg(message, 'Plot Centroids?', 'OK', 'Cancel', 'Cancel');% Note: reply will = '' for Upper right X, 'OK' for OK, and 'Cancel' for Cancel.if strcmpi(reply, 'Cancel')return;endsubplot(3, 3, 1);hold on; % Don't blow away image.for k = 1 : numberOfBlobs           % Loop through all keeper blobs.% Identify if blob #k is a dime or nickel.itsADime = allBlobAreas(k) < 2200; % Dimes are small.if itsADime% Plot dimes with a red +.plot(centroidsX(k), centroidsY(k), 'r+', 'MarkerSize', 10, 'LineWidth', 2);else% Plot dimes with a blue x.plot(centroidsX(k), centroidsY(k), 'bx', 'MarkerSize', 10, 'LineWidth', 2);endend%%% Now use the keeper blobs as a mask on the original image.% This will let us display the original image in the regions of the keeper blobs.maskedImageDime = originalImage; % Simply a copy at first.maskedImageDime(~keeperBlobsImage) = 0;  % Set all non-keeper pixels to zero.subplot(3, 3, 8);imshow(maskedImageDime);axis image;title('Only the 3 brightest dimes from the original image', 'FontSize', captionFontSize);%%% Now let's get the nickels (the larger coin type).keeperIndexes = find(allBlobAreas > 2000);  % Take the larger objects.% Note how we use ismember to select the blobs that meet our criteria.nickelBinaryImage = ismember(labeledImage, keeperIndexes);% Let's get the nickels from the original grayscale image, with the other non-nickel pixels blackened.% In other words, we will create a "masked" image.maskedImageNickel = originalImage; % Simply a copy at first.maskedImageNickel(~nickelBinaryImage) = 0;  % Set all non-nickel pixels to zero.subplot(3, 3, 9);imshow(maskedImageNickel, []);axis image;title('Only the nickels from the original image', 'FontSize', captionFontSize);%%elapsedTime = toc;% Alert user that the demo is done and give them the option to save an image.message = sprintf('Done making measurements of the features.\n\nElapsed time = %.2f seconds.', elapsedTime);message = sprintf('%s\n\nCheck out the figure window for the images.\nCheck out the command window for the numerical results.', message);message = sprintf('%s\n\nDo you want to save the pseudo-colored image?', message);reply = questdlg(message, 'Save image?', 'Yes', 'No', 'No');% Note: reply will = '' for Upper right X, 'Yes' for Yes, and 'No' for No.if strcmpi(reply, 'Yes')% Ask user for a filename.FilterSpec = {'*.PNG', 'PNG Images (*.png)'; '*.tif', 'TIFF images (*.tif)'; '*.*', 'All Files (*.*)'};DialogTitle = 'Save image file name';% Get the default filename.  Make sure it's in the folder where this m-file lives.% (If they run this file but the cd is another folder then pwd will show that folder, not this one.thisFile = mfilename('fullpath');[thisFolder, baseFileName, ext] = fileparts(thisFile);DefaultName = sprintf('%s/%s.tif', thisFolder, baseFileName);[fileName, specifiedFolder] = uiputfile(FilterSpec, DialogTitle, DefaultName);if fileName ~= 0% Parse what they actually specified.[folder, baseFileName, ext] = fileparts(fileName);% Create the full filename, making sure it has a tif filename.fullImageFileName = fullfile(specifiedFolder, [baseFileName '.tif']);% Save the labeled image as a tif image.imwrite(uint8(coloredLabels), fullImageFileName);% Just for fun, read image back into the imtool utility to demonstrate that tool.tifimage = imread(fullImageFileName);imtool(tifimage, []);endendmessage = sprintf('Would you like to crop out each coin to individual images?');reply = questdlg(message, 'Extract Individual Images?', 'Yes', 'No', 'Yes');% Note: reply will = '' for Upper right X, 'Yes' for Yes, and 'No' for No.if strcmpi(reply, 'Yes')figure;% Create a new figure window.% Maximize the figure window.set(gcf, 'Units','Normalized','OuterPosition',[0 0 1 1]);for k = 1 : numberOfBlobs           % Loop through all blobs.% Find the bounding box of each blob.thisBlobsBoundingBox = blobMeasurements(k).BoundingBox;  % Get list of pixels in current blob.% Extract out this coin into it's own image.subImage = imcrop(originalImage, thisBlobsBoundingBox);% Determine if it's a dime (small) or a nickel (large coin).if blobMeasurements(k).Area > 2200coinType = 'nickel';elsecoinType = 'dime';end% Display the image with informative caption.subplot(3, 4, k);imshow(subImage);caption = sprintf('Coin #%d is a %s.\nDiameter = %.1f pixels\nArea = %d pixels', ...k, coinType, blobECD(k), blobMeasurements(k).Area);title(caption, 'FontSize', textFontSize);end% Display the MATLAB "peaks" logo.logoFig = subplot(3, 4, 11:12);caption = sprintf('A MATLAB Tutorial by ImageAnalyst');text(0.5,1.15, caption, 'Color','r', 'FontSize', 18, 'FontWeight','b', 'HorizontalAlignment', 'Center') ;positionOfLowerRightPlot = get(logoFig, 'position');L = 40*membrane(1,25);logoax = axes('CameraPosition', [-193.4013 -265.1546  220.4819],...'CameraTarget',[26 26 10], ...'CameraUpVector',[0 0 1], ...'CameraViewAngle',9.5, ...'DataAspectRatio', [1 1 .9],...'Position', positionOfLowerRightPlot, ...'Visible','off', ...'XLim',[1 51], ...'YLim',[1 51], ...'ZLim',[-13 40], ...'parent',gcf);s = surface(L, ...'EdgeColor','none', ...'FaceColor',[0.9 0.2 0.2], ...'FaceLighting','phong', ...'AmbientStrength',0.3, ...'DiffuseStrength',0.6, ... 'Clipping','off',...'BackFaceLighting','lit', ...'SpecularStrength',1, ...'SpecularColorReflectance',1, ...'SpecularExponent',7, ...'Tag','TheMathWorksLogo', ...'parent',logoax);l1 = light('Position',[40 100 20], ...'Style','local', ...'Color',[0 0.8 0.8], ...'parent',logoax);l2 = light('Position',[.5 -1 .4], ...'Color',[0.8 0.8 0], ...'parent',logoax);end</span>

0 0