在视盘周围画一个圆

8次浏览(过去30天)
AJay
AJay 2018年8月4日
评论道: AJay2018年8月4日
你好,
我是Matlab的新手。在我的项目中,我应该沿着视网膜图像中发现的视盘的边界画一个圆。(其实我是想检测视盘)我做了些工作
I = imread(“I.png”);
应用梯度滤镜百分比
[Gmag Gdir] = imgradient(I,“普瑞维特”);
figure, imshow(Gmag, []), title(“梯度大小”
figure, imshow(Gdir, []), title(的梯度方向
%二值图像与阈值
bi = Gmag > 70;
Gx = [1 +2 +1;0 0 0;-2 -1];Gy = Gx';
temp_x = conv2(bi, Gx,“相同”);
temp_y = conv2(bi, Gy,“相同”);
B2 =√(temp_x.)^2 + temp_y.^2);
图中,imshow (b2);
%水平和垂直打开的图像
Se90 = strel(“行”, 90);
Se0 = strel(“行”3 0);
BWdil = imdilate(b2, [se90 se0]);
图中,imshow (BWdil);
%寄宿生已被清除
BWnobo = imclearborder(BWdil,4);
图中,imshow (BWnobo);
%精化边缘
SeD = strel(“钻石”1);
BWf = imerosion (BWnobo, SeD);
BWfinal = imerosion (BWf,SeD);
图中,imshow (BWf),
%度检测用im2bw完成
x = im2bw(BWf,0.5);
图,imshow (x)、标题(“X形象”);
我在视盘周围画了一条虚线。谁能帮我沿着视盘的边缘画一个合适的圆,并以圆的半径得到中心点的坐标?
所附图像I =原始灰度图像
<<
<<
>> x =代码的最终输出
>>
谢谢

接受的答案

图像分析
图像分析 2018年8月4日
我不会做边缘检测。这是典型的“新蜜蜂”做的事情,很少奏效。因为你的视盘是图像左侧的一个明亮的斑点,并且已知/假设是一个完美的圆,你可以利用这个知识,对图像进行阈值,以找到圆盘的区域(或至少是大部分),然后将斑点的“好”右边使用 来自FAQ的代码 .代码如下:
在一个特定的图像中找到视盘的例行程序。
clc;清除命令窗口。
关闭所有关闭所有图形(imtool.)
清晰;删除所有现有变量。或者clearvars。
工作空间;确保显示工作区面板。
格式长g
格式紧凑的
fontSize = 20;
%===============================================================================
%在灰度演示图像中读取。
文件夹= pwd;确定演示文件夹的位置(适用于所有版本)。
baseFileName =“i.jpg”
获取包含路径的完整文件名。
fullFileName = fullfile(文件夹,baseFileName);
检查文件是否存在。
如果~存在(fullFileName“文件”
这个文件不存在——在那个文件夹里找不到。。
通过剥离文件夹来检查文件的整个搜索路径(其他文件夹)。
fullFileNameOnSearchPath = baseFileName;%这次没有路径。
如果~存在(fullFileNameOnSearchPath“文件”
还是没有找到。提醒用户。
errorMessage = sprintf(“错误:搜索路径文件夹中不存在%s。”, fullFileName);
uiwait (warndlg (errorMessage));
返回
结束
结束
rgbImage = imread(fullFileName);
获取图像的尺寸。
% numberOfColorChannels对于灰度图像应该= 1,对于RGB彩色图像应该= 3。
[rows, columns, numberOfColorChannels] = size(rgbImage)
如果1 . numberOfColorChannels >
这并不是我们所期望的灰度,而是彩色。。
%使用所有通道的加权和来创建灰度图像。
% grayImage = rgb2gray(rgbImage);
%替代方法:通过只取绿色通道将其转换为灰度,
%,这在一个典型的快照中将是噪声最小的通道。
grayImage = rgbImage(:,:, 2);走绿色通道。
其他的
grayImage = rgbImage;已经是灰色了。
结束
现在它的灰度范围为0到255。
显示图像。
Subplot (2,2,1);
imshow (grayImage []);
标题(原始图像的“字形大小”字形大小,“翻译”“没有”);
轴(“上”“图像”);
HP = impixelinfo();
%------------------------------------------------------------------------------
设置图形属性:
将图形放大至全屏。
集(gcf,“单位”“归一化”“OuterPosition”, [0, 0.04, 1, 0.96]);
去掉图顶部的工具栏和下拉菜单。
% set(gcf, '工具栏','none', '菜单','none');
为标题栏指定一个名称。
集(gcf,“名字”“ImageAnalyst演示”“NumberTitle”“关闭”
drawnow;
光盘已知在左边,所以擦掉右边的图像。。
clippedImage = grayImage;%初始化。
clippedImage(:, 1200:end) = grayImage(1,1);%设置为周围模板。
显示直方图
Subplot (2,2,2);
[counts, grayLevels] = histcounts(clippedImage(:));
Counts (Counts == max(Counts)) = 0;抑制峰值
栏(灰度(1:end-1)计数);
网格
标题(“原始图像直方图”“字形大小”字形大小,“翻译”“没有”);
将图像二值化
binaryImage = clippedImage >= 245;
取最大的一团
binaryImage = bwareafilt(binaryImage, 1);
%取凸包
binaryImage = bwconvhull(binaryImage);
显示图像。
Subplot (2,2,3);
imshow (binaryImage []);
标题(的二进制图像“字形大小”字形大小,“翻译”“没有”);
轴(“上”“图像”);
HP = impixelinfo();
我们知道/假设视盘的“好部分”在右边,
找到右边的像素。
首先找到界限
边界= bwboundaries(binaryImage);
xBoundary =边界{1}(:,2);
yBoundary =边界{1}(:,1);
%向下扫描寻找右边缘
xRight = 0(1,列);
yRight = 0(1,列);
Row = 1:表示行
x = find(binaryImage(row,:), 1,“最后一次”);
如果~ isempty (x)
xRight(row) = x;
yRight(row) = row;
结束
结束
删除没有对象的行。%
noObjectRows = xRight == 0;
xRight(noObjectRows) = [];
yRight(noObjectRows) = [];
将xRight和yRight组合成一个圆
[xCenter, yCenter, R, a] = circfit(xRight,yRight);
%绘图图像。
显示图像。
Subplot (2,2,4);
imshow (grayImage []);
标题('原图像与圆盘圈'“字形大小”字形大小,“翻译”“没有”);
轴(“上”“图像”);
HP = impixelinfo();
viscircles([xCenter, yCenter], R);
%常见问题中的圆拟合程序。
函数[xc,yc,R,a] = circfit(x,y)
在x,y平面上拟合一个圆
% [xc, yc, r, a] = circfit (x, y)
%结果为中心点(yc,xc),半径为r
%输出,描述圆的方程:
% x ^ 2 + y ^ 2 + (1) * x + y (2) * + (3) = 0
作者:Bucher izhak 1991年10月25日
n =长度(x);xx x = x。*;yy = y。* y;xy y = x。*;
= [(x)和(y) n;和(xy)和(yy)和(y);和(xx)和(xy)和(x));
B =[总和(xx + yy);总和(xx。* y + yy。* y);总和(xx。* x + xy。* y)];
= \ B;
Xc = -.5*a(1);
Yc = -.5*a(2);
R =√((a(1)²+a(2)²)/4-a(3));
结束
2的评论
AJay
AJay 2018年8月4日
非常感谢。这是一个极好的回答。我从你的代码中学到了很多。(尽管如此,还是有一些地方我看不懂。我会很快赶上他们的。)我有勇气提高我的Matlab和图像处理技能。

登录评论。

更多答案(0)

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!