Python 在图像中查找具有相同强度的项目
如何在三维图像中找到所有点(或区域),其中前两个维度显示分辨率,第三个维度显示密度?我可以使用Matlab或Python。我想知道是否有一个本机函数用于查找计算成本最低的点。 更新: 假设我有以下几点:Python 在图像中查找具有相同强度的项目,python,matlab,image-processing,matrix,computer-vision,Python,Matlab,Image Processing,Matrix,Computer Vision,如何在三维图像中找到所有点(或区域),其中前两个维度显示分辨率,第三个维度显示密度?我可以使用Matlab或Python。我想知道是否有一个本机函数用于查找计算成本最低的点。 更新: 假设我有以下几点: A= [1,2,3; 4,6,6; 7,6,6] A = 1 2 3 4 6 6 7 6 6 >> B=[7,8,9; 10,11,11; 1, 11,11] B = 7 8
A= [1,2,3; 4,6,6; 7,6,6]
A =
1 2 3
4 6 6
7 6 6
>> B=[7,8,9; 10,11,11; 1, 11,11]
B =
7 8 9
10 11 11
1 11 11
>> C=[0,1,2; 3, 7, 7; 5,7,7]
C =
0 1 2
3 7 7
5 7 7
我怎么才能找到A的所有值都等于B的所有值和C的所有值的下平方?如果这太多,我怎么才能找到A中所有值相等的较低平方?
*显示的值是图像的强度
更新:尝试提供的答案,但出现以下错误:
>> c=conv2(M,T, 'full');
Warning: CONV2 on values of class UINT8 is obsolete.
Use CONV2(DOUBLE(A),DOUBLE(B)) or CONV2(SINGLE(A),SINGLE(B)) instead.
> In uint8/conv2 (line 10)
Undefined function 'conv2' for input arguments of type 'double' and attributes 'full 3d real'.
Error in uint8/conv2 (line 17)
y = conv2(varargin{:});
*还尝试了convn
,但花了很长时间,所以我就停止了!
基本上如何对如上所述的2D阵列执行此操作?请查看
二维相关基本上是将两幅图像相互“滑动”,并将重叠的点积相加
更多阅读:
退房
二维相关基本上是将两幅图像相互“滑动”,并将重叠的点积相加
更多阅读:
您可以使用一对水平和垂直1D过滤器,这样水平过滤器的内核为
[1-1]
,而垂直过滤器的内核为[1;-1]
。这样做的效果是,对于每个维度中的每个元素,它分别采用水平和垂直成对距离。然后可以使用这两个内核执行图像过滤或卷积,以确保复制边界。为了能够找到一致的区域,通过检查两个结果中的哪些区域在它们之间映射为0,这将为您提供区域,这些区域在所有通道上独立一致
为此,首先将两个过滤结果的取相反的,这样将变为0的均匀区域现在为1,反之亦然。同时对这两个像素执行逻辑
和操作,然后确保每个像素的所有值都是真
。这意味着,对于该图像中的空间位置,所有值都与您期望的一致
在MATLAB中,假设您有图像处理工具箱,使用该工具箱对图像进行过滤,然后在MATLAB中暂时查看两个过滤结果,然后使用该工具箱查找所搜索区域的坐标。因此,请这样做:
%# Reproducing your data
A = [1,2,3; 4,6,6; 7,6,6];
B = [7,8,9; 10,11,11; 1, 11,11];
C = [0,1,2; 3, 7, 7; 5,7,7];
%# Create a 3D matrix to allow for efficient filtering
D = cat(3, A, B, C);
%# Filter using the kernels
ker = [1 -1];
ker2 = ker.'; %#
out = imfilter(D, ker, 'replicate');
out2 = imfilter(D, ker2, 'replicate');
%# Find uniform regions
regions = all(~out & ~out2, 3);
%# Determine the locations of the uniform areas
R = regionprops(regions, 'BoundingBox');
%# Round to ensure pixel accuracy and reshape into a matrix
coords = round(reshape([R.BoundingBox], 4, [])).';
coords
将是一个nx4
矩阵,每一行都告诉边界框原点的左上角坐标以及边界框的宽度和高度。行中的第一个和第二个元素是列和行坐标,而第三个和第四个元素是边界框的宽度和高度
我们检测到的区域可以在regions
变量中找到。这两种情况都表明:
>> regions
regions =
3×3 logical array
0 0 0
0 1 1
0 1 1
>> coords
coords =
2 2 2 2
这告诉我们,我们已将“一致性”区域定位为右下角,而边界框左上角的坐标为第2行第2列,宽度和高度分别为2和2。您可以使用一对水平和垂直1D过滤器,使水平过滤器的内核为
[1-1]
而垂直过滤器的内核为[1;-1]
。这样做的效果是,它分别对每个维度中的每个元素采用水平和垂直成对距离。然后,您可以使用这两个内核执行图像过滤或卷积,以确保复制边界。为了能够找到统一的区域,请检查两个结果中的哪些区域映射到0两者之间,这将为您提供在所有通道上独立统一的区域
为此,您首先将两个过滤结果的取相反的,这样将变为0的均匀区域现在是1,反之亦然。您将对这两个结果一起执行逻辑
和操作,然后确保每个像素的所有值在时间上都是真
对于此图像中的空间位置,所有值的一致性与您期望的一致性相同
在MATLAB中,假设您有图像处理工具箱,使用来过滤图像,然后在MATLAB中暂时查看两个过滤结果,然后使用来查找所搜索区域的坐标。因此,请执行以下操作:
%# Reproducing your data
A = [1,2,3; 4,6,6; 7,6,6];
B = [7,8,9; 10,11,11; 1, 11,11];
C = [0,1,2; 3, 7, 7; 5,7,7];
%# Create a 3D matrix to allow for efficient filtering
D = cat(3, A, B, C);
%# Filter using the kernels
ker = [1 -1];
ker2 = ker.'; %#
out = imfilter(D, ker, 'replicate');
out2 = imfilter(D, ker2, 'replicate');
%# Find uniform regions
regions = all(~out & ~out2, 3);
%# Determine the locations of the uniform areas
R = regionprops(regions, 'BoundingBox');
%# Round to ensure pixel accuracy and reshape into a matrix
coords = round(reshape([R.BoundingBox], 4, [])).';
coords
将是一个nx4
矩阵,每一行告诉边界框原点的左上角坐标以及边界框的宽度和高度。行中的第一和第二个元素是列和行坐标,而第三和第四个元素是边界框的宽度和高度
我们检测到的区域可以在regions
变量中找到。这两个变量都显示:
>> regions
regions =
3×3 logical array
0 0 0
0 1 1
0 1 1
>> coords
coords =
2 2 2 2
这说明我们已将“一致性”区域定位为右下角,而边界框左上角的坐标为第2行第2列,宽度和高度分别为2和2。可能的解决方案:
A = [1,2,3; 4,6,6; 7,6,6];
B = [7,8,9; 10,11,11; 1, 11,11];
C = [0,1,2; 3, 7, 7; 5,7,7];
%create a 3D array
D = cat(3,A,B,C)
%reshape the 3D array to 2D
%its columns represent the third dimension
%and its rows represent resolution
E = reshape(D,[],size(D,3));
%third output of the unique function applied row-wise to the data
%represents the label of each pixel a [m*n, 1] vector created
[~,~,F] = unique(E,'rows');
%reshape the vector to a [m, n] matrix of labels
result = reshape(F, size(D,1), size(D,2));
可以将三维矩阵重塑为二维矩阵(E
),其列表示第三维,其行表示分辨率
然后使用unique
功能可以标记图像
我们有一个3D矩阵:
A =
1 2 3
4 6 6
7 6 6
B =
7 8 9
10 11 11
1 11 11
C =
0 1 2
3 7 7
5 7 7
当我们将3D矩阵重塑为2D矩阵时,我们得到:
E =
1 7 0
4 10 3
7 1 5
2 8 1
6 11 7
6 11 7
3 9 2
6 11 7
6 11 7
因此,我们需要根据行的值对行进行分类
Unique函数能够提取唯一的行,并将相同的标签分配给彼此相等的行
这里variableF
捕获作为每行标签的唯一函数的第三个输出
F =
1
4
6
2
5
5
3
5
5
应该将其重塑为2D
结果=
1 2 3
4 5 5
6 5 5
<