如何从图像中提取圆心?
如果说我有一个地图(图像格式)如图所示。如何才能将其中的6个黑色圆圈的圆心提取出来,并知道它们圆心的坐标。
假设图像中左下角的像素为{0, 0}。 利用Mathematica的Drawing tool就可以擷取圖形上論文的數據!如果有問題,看看Wolfram的教學影片吧!
How to Get Coordinates for Points in a Plot
http://www.wolfram.com/broadcast/screencasts/howtogetcoordinatesforpointsinaplot/?w=576&h=496 I like Screecast, however it's different between grahpics and image.
If it is grahpics, it is easy, I am meeting a image problem. 本帖最后由 FreddyMusic 于 2010-4-24 10:32 编辑
Thanks, I tried and found it also works for an image in Mathematica.
However, manual selecting takes too many time, I have about 150 points, taking long time to finish. 能不能导入图像后让程序自动去寻找圆和圆心呢? 当然可以,但是也会比较费事,因为从颜色识别是黑色。会留下中文字。
除非我们有识别几何图形的程序和代码,来识别一个圆,当然找圆心是容易的事。 本帖最后由 caoer 于 2010-4-25 09:37 编辑
用暴力统计学方法应该可以,我用matlab试验了一下,效果还不错。
如果只需要圆心坐标,只需取每个簇内所有点的坐标算术平均值即可。
http://forum.simwe.com/viewthread.php?tid=928627
::::::::::输出图形::::::::::
http://forum.simwe.com/attachments/day_100425/10042509111cdfee1bde7aae5a.png .png caoer,
地图我给你。
你用程序跑跑,然后把所有的坐标点告诉我。
如果能够有次序的同站名对应,最好不过。 本帖最后由 caoer 于 2010-4-26 07:44 编辑
这样的大地图恐怕只有64位以上的机子能跑,
算了5个小时,还没跑出来,耐心等待中 本帖最后由 FreddyMusic 于 2010-4-29 09:19 编辑
test=Binarize[圖形];
testdata=Flatten],1];
temp=Table],1]-testdata,#==0&]>=100,{j+4.5,267-i+5},"N"],{i,266},{j,197}];
tempdata=Select,ToString[#]!="N"&]
ListPlot,AspectRatio->1.5,Epilog->{Line@tempdata}]
c,
你的代码是基于什么来识别圆圈的? 能否简介一下?
我在下面又加了一张图,供你调试。
第一幅小图:r = 5;
yanse = 255;
(*先将原图存作E:\\ 2001.jpg*)
arr = Import["E:\\2001.jpg", "Data"];
tu = Import["E:\\2001.jpg"]
mianji = Import["E:\\2001.jpg", "ImageSize"];
chang = mianji[];
kuan = mianji[];
weizhi = {};
For[j = 1 + r, j <= kuan - r, j++,
For[k = 1 + r, k <= chang - r, k++,
If] != arr[] &&
arr[] != arr[] &&
arr[] != arr[] &&
arr[] != arr[] &&
arr[] == {yanse, yanse, yanse},
AppendTo];];];
lenw = Length
"圆心在图片中的位置:"
Show[Table[
ListPlot[{weizhi[]}, AxesOrigin -> {0, 0},
AspectRatio -> Automatic, PlotRange -> {{0, chang}, {0, kuan}},
Frame -> True], {s, 1, lenw}]]
weizhi2 = Partition, 2];
brr = {{}};
For[j = 1, True, j++,
AppendTo;
AppendTo], weizhi2[]];
weizhi2 = Delete;
len = Length;
For[k = 1, k <= len, k++,
If] - brr[]] <= 2 r,
AppendTo], weizhi2[]];
weizhi2 = Delete;
len = Length;
k--;];];
len = Length;
If;];];
"圆心的数目:"
shumu
"圆心的坐标:"
Table], {j, 1, shumu}]
% // N第二幅小图只需要调节一下圆内点的颜色即可:r = 5;
yanse = 250;
(*先将原图存作E:\\ 2002.jpg*)
arr = Import["E:\\2002.jpg", "Data"];
tu = Import["E:\\2002.jpg"]
mianji = Import["E:\\2002.jpg", "ImageSize"];
chang = mianji[];
kuan = mianji[];
weizhi = {};
For[j = 1 + r, j <= kuan - r, j++,
For[k = 1 + r, k <= chang - r, k++,
If] != arr[] &&
arr[] != arr[] &&
arr[] != arr[] &&
arr[] != arr[] && arr[] >= yanse &&
arr[] >= yanse && arr[] >= yanse,
AppendTo];];];
lenw = Length
"圆心在图片中的位置:"
Show[Table[
ListPlot[{weizhi[]}, AxesOrigin -> {0, 0},
AspectRatio -> Automatic, PlotRange -> {{0, chang}, {0, kuan}},
Frame -> True], {s, 1, lenw}]]
weizhi2 = Partition, 2];
brr = {{}};
For[j = 1, True, j++,
AppendTo;
AppendTo], weizhi2[]];
weizhi2 = Delete;
len = Length;
For[k = 1, k <= len, k++,
If] - brr[]] <= 2 r,
AppendTo], weizhi2[]];
weizhi2 = Delete;
len = Length;
k--;];];
len = Length;
If;];];
"圆心的数目:"
shumu
"圆心的坐标:"
Table], {j, 1, shumu}]
% // N test=Binarize[圖形];
(*先取出一個測試點*)
testdata=Flatten@ImageData];
(*如果選取範圍的像素與測試資料重疊個數超過93個則取出轉換座標,否則記為N*)
temp=Table]-testdata,#==0&]>=93,{j-5.5,400-i-4},"N"],{i,200},{j,389}];
tempdata=Select,ToString[#]!="N"&]
ListPlot, AspectRatio -> 1.5]
不過會有少許誤差,可能另外寫個函數刪除掉 楼主,可以分割图像,拟合出圆的方程,这样就可以确定圆心了! 赞同 c 的比较匹配的方法较优,有一定的通用性。
但是如何才能有效的划分原图像,同基准图像进行比较呢?
你知道图很大也很多,如何划分不合理,
可能会将一个圆上半圆分在一张图上,下半圆分在了另一张图上,从而无法有效比较。
g 你的方法核心是什么,简介一下吧? 这个用8.0的图像处理的几个新函数预处理下会比较简单,正好我在做一个围棋图像坐标识别的函数,所以有似的地方,Manipulate , {n, 1, 10, 1}]找到一个合适的参数,此处k》=3即可
比如一楼的图片,预处理
SelectComponents, "FilledCircularity",1]就只剩下圆了。
预处理方法有许多 比如这张地图,预处理成这样子,之后看ImageData行和列的和,出现0的位置应该容易求了吧。:lol
testPic =
Dilation,
"FilledCircularity", 1] // MinDetect, 2]
// ColorNegate // Thinning
当然可以直接处理成只有圆心的图片,SelectComponents, Small] // Thinning
把圆先缩小,然后提取,然后再缩小只剩下圆心,这样用ImageData就更好找了。
当然,还有个方法是直接用ImageKeyPoints,不过要进行些处理,调整一个参数使得正好得到正确数量的points:D
wolframblog 前一段时间有篇文章,挺有意思。
http://blog.wolfram.com/2011/09/09/building-a-microscopy-application-in-mathematica/
解决的问题差不多。
页:
[1]