首先,这个问题让我想起了一些可能对学习有用的演示:
- DNA微阵列图像处理 http://www.mathworks.com/matlabcentral/fileexchange/2573-dna-microarray-image-processing-case-study
- Matlab 数独求解器 http://www.mathworks.com/videos/matlab/sudoku.html
-
Iphone 数独解算器 http://sudokugrab.blogspot.com/2009/07/how-does-it-all-work.html博客文章,解释图像处理
就我个人而言,我认为最简单的方法是检测图像中的正方形。
1)去除背景和小瑕疵
f_makebw = @(I) im2bw(I.data, double(median(I.data(:)))/1.3);
bw = ~blockproc(im, [128 128], f_makebw);
bw = bwareaopen(bw, 30);
2)删除除正方形和圆形之外的所有内容。
se = strel('disk', 5);
bw = imerode(bw, se);
% Detect the squares and cricles via morphology
[B, L] = bwboundaries(bw, 'noholes');
3)使用“extend”检测正方形regionprops
。 “范围”指标测量边界框被填充的比例。这使其成为
区分圆形和正方形的好方法
stats = regionprops(L, 'Extent');
extent = [stats.Extent];
idx1 = find(extent > 0.8);
bw = ismember(L, idx1);
4) 这样您就可以使用自己的功能来同步或校正图像。要做到这一点,一种简单而可靠的方法是通过自相关函数。
这给出了很容易检测到的漂亮峰值。这些峰值可以通过匈牙利算法与模板图像中的 ACF 峰值进行匹配。一旦匹配,您就可以纠正旋转和缩放,因为您现在有了一个可以求解的线性系统:
x = Ax'
然后可以使用针对相同预定义模板的普通互相关来校正翻译。
如果一切顺利,您就知道有一个对齐或同步的图像,这将有助于确定点的位置。