Image processing 在图像中查找圆形
我有一个图像。我想检测我用红线标记的四个孔 我在下面的链接中有所有的图片。 输入图像(Input_Image.bmp) 预处理图像(PreprocessedImage.bmp) 工作图像(检测到的孔)(DetectedHoles.bmp) 非工作图像(仅检测到3个孔)(NonWorking.bmp) 最初,这是我对输入图像所做的预处理 输入图像:Input_Image.bmpImage processing 在图像中查找圆形,image-processing,Image Processing,我有一个图像。我想检测我用红线标记的四个孔 我在下面的链接中有所有的图片。 输入图像(Input_Image.bmp) 预处理图像(PreprocessedImage.bmp) 工作图像(检测到的孔)(DetectedHoles.bmp) 非工作图像(仅检测到3个孔)(NonWorking.bmp) 最初,这是我对输入图像所做的预处理 输入图像:Input_Image.bmp hcontadj=vision.ContrastAdjuster; Extracted_Rim_ContrasT_Ad
hcontadj=vision.ContrastAdjuster;
Extracted_Rim_ContrasT_Adj=step(hcontadj,Extracted_Rim);
J = adapthisteq(Extracted_Rim);
Sharp_Img=imsharpen(J);
se=strel('disk',300);
imtop_op=imtophat(Sharp_Img,se);
hgamma = ...
vision.GammaCorrector(90.0,'Correction','De-gamma');
% hgamma = ...
% vision.GammaCorrector(12.0,'Correction','Gamma');
y = step(hgamma, imtop_op);
h1 = imfilter(y,fspecial('gaussian',60,5));
H2=h1.*6.0;
se = strel('disk',14);
% Perform a morphological close operation on the image.
closeBW = imclose(H2,se);
figure, imshow(closeBW);
经过上述处理后获得的输出图像PreprocessedImage.bmp
imfindcircles()和viscircles()分别用于查找[centre,Raddi]和用蓝色标记圆
[centers, radii] = imfindcircles(New_Open_Img,[32 100],'Sensitivity',0.81,'ObjectPolarity','dark');
[h,x,y]=viscircles(centers, radii,'EdgeColor','b');
在上述两个函数imfindcircles()和viscircles()之后获得的输出图像是DetectedHoles.bmp
仅检测到三个孔的非工作图像
不工作。bmp。在这种情况下,所有四个圆都无法正确检测
我微调了imfindcircles()
中的灵敏度和半径,但仍然无法检测到所有的圆
如果您能给我一些解决这个问题的想法,我将不胜感激
谢谢我假设您使用的是Matlab,不幸的是我没有在这里安装Matlab,但我可以用python给您一个答案,它应该直接翻译成Matlab 我认为通过对圆(
imfindcircles
)使用Hough变换,您正在朝着一个好的方向前进。但关键是要正确设置半径范围。尤其是如果你希望你处理的图像是相似的。如果你上传的图像是有代表性的,那么你的半径应该在10到15之间(可能太大了,因为你想要检测的圆圈只有25像素宽)
另外,我不会使用形态学操作对图像进行预处理,而是使用边缘检测器。我用canny边缘检测器BW1=edge(I,'canny')代码>。如果你这样做,你也会检测到中间的圆圈,你可以在后处理步骤中移除它。您只需检查哪个圆既不是最远的上下圆,也不是最远的左或右圆
基于python/skimage的代码(与示例代码略有不同:):
笔记本(带结果)如下:
在Matlab中,它应该是
I = imread('test.jpeg');
BW1 = edge(I,'Canny');
[centers, radii, metric] = imfindcircles(BW1,[10 15]);
centersStrong5 = centers(1:5,:);
radiiStrong5 = radii(1:5);
metricStrong5 = metric(1:5);
imshow(I)
viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');
你用什么语言?Matlab?是的,我正在使用Matlab。
I = imread('test.jpeg');
BW1 = edge(I,'Canny');
[centers, radii, metric] = imfindcircles(BW1,[10 15]);
centersStrong5 = centers(1:5,:);
radiiStrong5 = radii(1:5);
metricStrong5 = metric(1:5);
imshow(I)
viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');