FreddyMusic 发表于 2010-4-24 09:56:38

如何从图像中提取圆心?

如果说我有一个地图(图像格式)如图所示。



如何才能将其中的6个黑色圆圈的圆心提取出来,并知道它们圆心的坐标。
假设图像中左下角的像素为{0, 0}。

chungyuandye 发表于 2010-4-24 10:03:18

利用Mathematica的Drawing tool就可以擷取圖形上論文的數據!如果有問題,看看Wolfram的教學影片吧!
How to Get Coordinates for Points in a Plot
http://www.wolfram.com/broadcast/screencasts/howtogetcoordinatesforpointsinaplot/?w=576&h=496

FreddyMusic 发表于 2010-4-24 10:20:44

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:26:36

本帖最后由 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.

jimogsh 发表于 2010-4-24 11:30:25

能不能导入图像后让程序自动去寻找圆和圆心呢?

FreddyMusic 发表于 2010-4-24 12:28:45

当然可以,但是也会比较费事,因为从颜色识别是黑色。会留下中文字。
除非我们有识别几何图形的程序和代码,来识别一个圆,当然找圆心是容易的事。

caoer 发表于 2010-4-25 08:23:54

本帖最后由 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

FreddyMusic 发表于 2010-4-25 10:58:45

caoer,

地图我给你。

你用程序跑跑,然后把所有的坐标点告诉我。

如果能够有次序的同站名对应,最好不过。

caoer 发表于 2010-4-26 02:48:45

本帖最后由 caoer 于 2010-4-26 07:44 编辑

这样的大地图恐怕只有64位以上的机子能跑,
算了5个小时,还没跑出来,耐心等待中

chungyuandye 发表于 2010-4-28 19:47:05

本帖最后由 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}]

FreddyMusic 发表于 2010-4-29 09:27:31

c,

你的代码是基于什么来识别圆圈的? 能否简介一下?

我在下面又加了一张图,供你调试。

ggggwhw 发表于 2010-4-29 16:56:20

第一幅小图: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

chungyuandye 发表于 2010-4-29 19:12:20

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]
不過會有少許誤差,可能另外寫個函數刪除掉

minjiecow 发表于 2010-4-30 13:00:25

楼主,可以分割图像,拟合出圆的方程,这样就可以确定圆心了!

FreddyMusic 发表于 2010-4-30 15:02:08

赞同 c 的比较匹配的方法较优,有一定的通用性。
但是如何才能有效的划分原图像,同基准图像进行比较呢?
你知道图很大也很多,如何划分不合理,
可能会将一个圆上半圆分在一张图上,下半圆分在了另一张图上,从而无法有效比较。

g 你的方法核心是什么,简介一下吧?

HyperGroups 发表于 2011-9-11 00:30:17

这个用8.0的图像处理的几个新函数预处理下会比较简单,正好我在做一个围棋图像坐标识别的函数,所以有似的地方,Manipulate , {n, 1, 10, 1}]找到一个合适的参数,此处k》=3即可
比如一楼的图片,预处理
SelectComponents, "FilledCircularity",1]就只剩下圆了。
预处理方法有许多

HyperGroups 发表于 2011-9-11 01:09:03

比如这张地图,预处理成这样子,之后看ImageData行和列的和,出现0的位置应该容易求了吧。:lol
testPic =
Dilation,
    "FilledCircularity", 1] // MinDetect, 2]
// ColorNegate // Thinning

HyperGroups 发表于 2011-9-11 01:43:10


当然可以直接处理成只有圆心的图片,SelectComponents, Small] // Thinning
把圆先缩小,然后提取,然后再缩小只剩下圆心,这样用ImageData就更好找了。

HyperGroups 发表于 2011-9-11 04:32:24


当然,还有个方法是直接用ImageKeyPoints,不过要进行些处理,调整一个参数使得正好得到正确数量的points:D

FreddyMusic 发表于 2011-9-24 10:51:24

wolframblog 前一段时间有篇文章,挺有意思。

http://blog.wolfram.com/2011/09/09/building-a-microscopy-application-in-mathematica/

解决的问题差不多。
页: [1]
查看完整版本: 如何从图像中提取圆心?