How to have automated thresholding to deal with disparities between images

조회 수: 3 (최근 30일)
Hi,
I have huge sets of images of some dark circles against a background, the darkness of the background can vary. What I am trying to do is load the image, threshold it, convert to B&W, then take centroids of the circles and set a crop rectangle to crop the image based on the average of the centroid positions, then I want to save that cropped image into a cell (or other if there's a better method) and then stitch the cropped images together in the sequence they were saved - e.g. image1 on the far left, image2 adjacent to its right.
So far my code is stumbling at the automated thresholding, I tried Otsu's method and received a similar error:
Index exceeds array bounds.
Error in crop_program_08 (line 14)
pic_testing=(files(k).name)
Code:
close all
clear all
clc
%%Get files
files=dir('/Users/imagexpertinc/Desktop/piccies/*.png');
N=numel(files)
ImageCell = cell(N,1);
%%************************************************************************
image1=imread(files(1).name);
%
for k=1:2
pic_testing=(files(k).name)
image=imread(files(k).name);
%%Show first Image
figure
image1=image;
imshow(image1)
title('1')
level = graythresh(image1)
threshold = 70; % custom threshold value
% image1_bw = image1 > threshold;
image1_bw = imbinarize(image1,level)
[centers,radii] = imfindcircles(image1_bw,[8 15],'ObjectPolarity','dark','Sensitivity',0.85)
figure
imshow(image1_bw)
% h = viscircles(centers,radii);
meanOfcenters=mean(centers(:,1));
MaxRadii=max(radii(:,1));
LimLow=meanOfcenters-(2*MaxRadii);
LimHI=meanOfcenters+(2*MaxRadii);
centersLimits={LimLow, LimHI};
centersLimits=cell2mat(centersLimits);
[HEIGHT,~]=size(image1_bw);
WIDTH=150;
XMIN= meanOfcenters-(WIDTH/2);
YMIN=1;
rect=[XMIN YMIN WIDTH HEIGHT];%where RECT is a 4-element vector with the form [XMIN YMIN WIDTH HEIGHT];
[x,y,I2,rect] = imcrop(image1_bw,rect);
% whos I2;
[CroppedImage] = imcrop(image1,rect);
ImageCell{k}=CroppedImage;
end
AA=ImageCell{:};
ImageCell = cat(2,ImageCell{:}) ;
hFig=figure('units','normalized','outerposition',[0 0 1 1]);
set(0,'CurrentFigure',hFig)
imshow(ImageCell);

채택된 답변

Anton Semechko
Anton Semechko 2018년 6월 27일
Here is a demo that uses automatic multi-level thresholding to isolate the disks:
im_files={'https://www.mathworks.com/matlabcentral/answers/uploaded_files/122855/picture1.png' ...
'https://www.mathworks.com/matlabcentral/answers/uploaded_files/122854/picture2.png'};
figure
for i=1:2
% Get the image
im=imread(im_files{i});
% Partion image into 4 classes
[~,~,LUT,~]=FastFCMeans(im,4);
L=LUT2label(im,LUT);
% Isolate disks
bw=L==1;
bw=bwareaopen(bw,10,8); % remove 8-connected blobs (if any) with fewer than 10 pixels
% Visualize
subtightplot(2,2,2*i-1), imshow(im)
subtightplot(2,2,2*i), imshow(bw)
end
Segmentation functions used in this demo can be downloaded from here
'subtightplot' function can be found here
  댓글 수: 2
Stephen Devlin
Stephen Devlin 2018년 6월 28일
Hi Anton, I am unable to replicate your result, in mine I see no white in the b&w image, have attached a screenshot. Best regards,
Steve
Anton Semechko
Anton Semechko 2018년 6월 28일
Do you have any other copies of 'FastFCMeans' function that you may have downloaded from here? If so, delete it, and use the newer version from here.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Geometric Transformation and Image Registration에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by