通过移动局部区域对整个图像的性质进行分析

1次观看(过去30天)
我正在使用regionprops函数来分析图像的属性。
因为图片的尺寸比较大,所以我需要把图片的一部分剪下来进行分析。
我想通过移动要分析的局部区域来显示整个图像的属性。
该图像为5120x5120灰度图像,图像为PNG文件。
似乎是I(1:1000, 1:1000)的形式,在保持整个像素信息的同时进行切割和分析。
我想知道如何分析窗口的边界(局部区域的边缘)。
有什么好办法吗?
4评论
沪江
沪江 2021年6月3日
我想将相邻像素识别为一个硬币(集群),并获得其质心值,强度平均值和std。
我正在使用一个原始文件转换成png文件。
我可以在将图像更改为另一个扩展后使用它吗?

登录评论。

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2021年6月3日
Img = rgb2gray(imread(“flamingos.jpg”));
%这假设图像在名为Img的变量中
Blocksize = 256;选择一个适合你的尺寸。
rows = size(Img,1);
cols = size(Img,2);
NRBLKS =楼层(行/块大小);
FRBLK =行- NRBLKS *块大小;
NCBLKS = floor(cols/blocksize);
FCBLK = cols - NCBLKS * blocksize;
RTSZ = [blocksize * ones(1,nrblks), frblk];
CTSZ = [blocksize * ones(1,ncblks), fcblk];
tiles = mat2cell(Img, rtsz, ctsz, size(Img,3));
大小(瓷砖)
ans = 1×2
4 6
%tiles现在是一个单元格数组的块大小为blocksize x
%number_of_channels(1表示灰度,3表示RGB)
Stats = cell(size(tiles));
K = 1:数字(tiles)
thistile = tiles{K};
BW = imbinalize (thistile);
these_stats = regionprops(BW, thistile,“重心”,的边界框(“大小),“meanintensity”,“pixelidxlist”);
Ncomp = size(these_stats,1);
STDS = cell(ncomp,1);
C = 1: ncomp
stds{K} = std(double(thistile(these_stats(C).PixelIdxList)));
结束
[these_stats。Stds] = Stds {:};
stats{K} = these_stats;
结束
统计数据
统计=4×6单元格数组
{211×1 struct}{189×1 struct}{136×1 struct}{226×1 struct}{139×1 struct}{27×1 struct}{67×1 struct}{48×1 struct}{81×1 struct}{46×1 struct}{67×1 struct}{2×1 struct}{146×1 struct}{182×1 struct}{259×1 struct}{73×1 struct}{118×1 struct}{7×1 struct}{468×1 struct}{454×1 struct}{152×1 struct}{82×1 struct}{140×1 struct}{4×1 struct}
此时,stats是一个单元格数组,每个条目都与原始图像的一部分相关。每个条目都是统计信息的结构数组。结构数组的元素数量将与图像子部分中检测到的连接组件数量相同。关于每个分量的质心、平均强度和标准偏差的信息都是存在的。
您可能希望在对BW的赋值和统计数据收集之间放入一个bwareafilt()调用,以便丢弃不重要的小块噪声,只保留较大的blot。也许……但这并不总是一个好主意。
现在,您遇到了一个问题:在每个tile边界上,您可能已经在两个tile之间细分了一个对象。可能只有一小块薄片最终出现在其中一个瓦片中,这就是为什么区域过滤并不总是一个好主意。您需要遍历每个tile的每个组件,并确定边界框是否触及tile的边缘:如果是,那么您可能必须合并来自相邻tile的组件。
您不能假设只有一个匹配的组件。考虑
1111 | 333
| 3
| 3
2222 | 333
其中|表示瓷砖边界。就regionprops而言,第1节和第2节彼此是不连接的,但是当您检查更大的上下文时,您可以看到它们都是同一个blob的一部分。情况可能会变得更糟:
1111 | 333
| 3
5 | 333
5|
5 | 444
| 4
2222 | 444
一个接一个的,在第一个中是3个不连接的blob,在第二个中是2个不连接的blob,但在更大的上下文中,实际上都是一个blob。
所以,在你有了贴图和组件之后,你必须把边界上的斑点拼接在一起,弄清楚它们是否需要合并,移除合并的斑点,然后 重新计算他们的数据
这并不是说这一切都是不可能的,但这是一种痛苦。一次性处理整个图像要容易得多。
5180 x 5180等于 一个大图像。26兆字节,如果是uint8。您的系统应该能够轻松地处理这些问题。我真的建议对整个图像进行处理,而不是试图将碰巧被瓷砖边界分割的斑点合并在一起。
如果您遇到了拾取无关小区域的问题,并且这会减慢您的速度,那么请在regionprops之前使用bwareafilt()。
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2021年6月3日
Minblobsize = 25;
BW = Img;
BW = bwareafilt(BW, [minblobsize inf]);
stats = regionprops(BW, Img,“重心”,的边界框(“大小),“meanintensity”,“pixelidxlist”);

登录评论。

更多答案(0)

社区寻宝

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

开始狩猎!