分裂重复的图像寻找模式

12个视图(30天)
垫
2023年5月17日
评论道: 2023年5月22日14:04
你好
我有一个形象,已由重复相同的模式(未知)。通常有4到12个重复。这张图片处理,旋转,剪裁(采取的一部分)。的几个例子图像(重命名为代码运行)被添加。我的目标是找到这种模式,是将图像分割成完全相同的瓷砖。
我的代码使用自相关找到重复的距离,但似乎并不总是工作。它应该找到合适的模式,还告诉我如果没有完整的瓦片。
旋转角度很好。代码有时工作,有时不。如果需要,我可以添加更多的例子。
如果你有一个更好的方法来找到解决方案,请让我知道
我希望这是我问清楚
非常感谢你
% %自相关
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
(行,关口)= (A)大小;
B = abs (fftshift (ifft2 (fft2 (A)。*连词(fft2 (A)))))。/ *关口(行);
% B = medfilt2 (B);
% %阈值矩阵,找到重心
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
C = B;
checkstart = max (C (:));
checkstart =圆(checkstart, 2);
检查= checkstart: -0.01:0
i = 1:行
j = 1:关口
如果B (i, j) < =检查
C (i, j) = 0;
其他的
C (i, j) = 1;
结束
结束
结束
L = bwlabel (C);
s = regionprops (L,“重心”);
如果元素个数(s) > = 3 & &元素个数(s) < = 10
打破
结束
结束
% %找到从中间质心距离和角度
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
中点=圆(元素个数(s) / 2);
=年代中期(中点);
p = 1:元素个数(s)
如果p ~ =中点
N = s (p);
△= middle.Centroid (1) -N.Centroid (1);
δy = middle.Centroid (2) -N.Centroid (2);
distance1 (p) =√(△^ 2) +(δy ^ 2));
距离(p) =圆(distance1 (p));
角(p) = atand(δy /△);
结束
结束
mindistance = min(距离(距离> 0));
p = 1:元素个数(距离)
如果距离(p) = = mindistance
minangle =角(p);
结束
结束
dif (1) = minangle - 90;
dif (2) = minangle;
dif (3) = minangle + 90;
adif = abs (dif);
adifmin = min (adif);
q = 1:元素个数(dif)
如果abs (dif (q)) = = adifmin
anglechange = dif (q);
结束
结束
如果anglechange > = 45
anglechange = anglechange - 90;
elseifanglechange < = -45
anglechange = anglechange + 90;
结束
D = imrotate (anglechange);
% %创建一个网格
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
(行,坳)= (D)大小;
x =地板((col-1) / (mindistance));
地板y =((第1行)/ (mindistance));
xn = 0: x
xpos (xn + 1) = 1 + xn * (mindistance);
结束
yn = 0: y
ypos (yn + 1) = 1 + yn * (mindistance);
结束
% %单独的瓷砖
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
w = 1;
公司= 1:元素个数(xpos) 1
jnc = 1:元素个数(ypos) 1
singletile {w} = D (ypos (jnc): ypos (jnc + 1), xpos(公司):xpos(公司+ 1);
w = w + 1;
结束
结束

接受的答案

为副总经理
为副总经理 2023年5月18日
编辑:为副总经理 2023年5月18日
这不是一个真正的答案。我要看着它,但是我发现它是容易重写它为了算出它在做什么。这是它在的地方:
%自相关
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
B = abs (fftshift (ifft2 (fft2 (A)。*连词(fft2 (A)))))。/元素个数(一个);
imshow (imcomplement (B))
% %
%阈值矩阵,找到重心
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
checkstart = max (B (:));
checkstart =圆(checkstart, 2);
检查= checkstart: -0.01:0
C = B >检查;
CC = bwconncomp (C);%这应该会更快
如果CC.NumObjects > = 4 & & CC.NumObjects < = 10
打破
结束
结束
s = regionprops (CC、“重心”);%这样做外
imshow (imcomplement (C))
% %
%从中间找到距离和角形心
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
%找到实际geometrically-central blob
imcenter = fliplr(大小(C, 1:2)) / 2;
distfromcenter =√总和(vertcat (s.Centroid) -imcenter)。^ 2, 2));
[~,refidx] = min (distfromcenter);%的索引参考峰
%找到所有其他斑点
nonrefidx = 1:元素个数(年代);
nonrefidx (refidx) = [];
%得到距离和角度关于参考
δ= s (refidx)。重心——vertcat (s (nonrefidx) .Centroid);
distfromref =√和三角洲。^ 2,2))
anglefromref = atand(δ(:,2)。/δ(:1));
%减少距离,得到角有关
[mindistance, idx] = min (distfromref);
minangle = anglefromref (idx);
% 45包角(-45)
%这一样东西dif和+ -45测试
anglechange = 45 - mod (45 - minangle, 90);
%旋转图像
D = imrotate (anglechange);
clc
mindistance
anglechange
imshow (imcomplement (D))
% %
% detile图像
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
%得到瓷砖
深圳=大小(D, 1:2);
mindistance =圆(mindistance);
瓷砖地板= (sz. / mindistance);% (x, y)
%使用mat2cell ()
M = mindistance *的(瓷砖(1),1);%瓷砖尺寸向量
N = mindistance *的(瓷砖(2),1);
Dt = D (1: mindistance *瓷砖(1),1:mindistance *花砖(2));%的作物
瓷砖= mat2cell (Dt, M, N);% detile
%显示瓷砖
蒙太奇(瓷砖,“边界”10“写成backgroundcolor”,“米”)
提供的图片都是相似的,他们没有一个完整的重复模式的至少在一个方向。虽然似乎有足够的信息来辨别正确的间距,给定的方法为notile找到mindistance给了错误的结果。垫和一个。垫(这些副本),它似乎sqrt(2)倍时失败。
好吧。垫文件似乎detile好,尽管这些模式显然不精确的复制。
我必须想想更多的notile.mat看能做些什么。
编辑:
我取代了第一部分:
%自相关
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %
B = normxcorr2(一个);%这似乎是更可靠
B = imtophat (B, (21));%顶环过滤器
B = mat2gray (B);%正常化
…这似乎为notile工作。垫了。detiling常规仍然不做任何有用的在这种情况下,由于图像中只有一个完整的瓷砖,但起码它可以正确的距离。
1评论
垫
2023年5月22日14:04
非常感谢为副总经理,在接下来的几天我将测试这个解决方案,这似乎适合我的需要。

登录置评。

更多的答案(2)

图像分析
图像分析 2023年5月17日
截图会有所帮助。你的模板(模式你搜索大图)改变大小或旋转时在不同的位置吗?你有试过 normxcorr2 (附加演示)?
1评论
垫
2023年5月17日
编辑: 2023年5月17日
对不起,这不是我的意思。我不是寻找一个特定的模板。我不知道这个模板。原始图像是由重复相同的模板。就像在你的例子中,想象这张照片是由相同的方块的洋葱。请画出*。垫文件我附在看到我的图片是什么样子的,或者下面的图片,在发现被称为原始瓷砖瓷砖,和它完全复制4次形象
或者在这个有很多重复(超过50,极端的理解)

登录置评。


图像分析
图像分析 2023年5月18日
如果它只是一个完美的复制一些瓷砖,为什么你就不能扫描过,直到一个列或行是相同的
(行、列)= (m)大小;
%第一扫描匹配的列
firstColumn = m (: 1);
坳= 1:列
如果isequal (firstColumn m(:,上校))
%这列是一样的第一个日志的大小
tileWidth = col - 1;
打破;
结束
结束
%下扫描匹配的行
:firstRow = m (1);
行= 1:行
如果isequal (firstRow m(行,:))
%这行是一样的第一日志大小
tileHeight =行- 1;
打破;
结束
结束
1评论
为副总经理
为副总经理 2023年5月18日
编辑:为副总经理 2023年5月18日
模式不整齐。
编辑:…他们也不是完全复制。

登录置评。

类别

找到更多的在图像处理和计算机视觉帮助中心文件交换

s manbetx 845


释放

R2023a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!