Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在图像中查找具有相同强度的项目_Python_Matlab_Image Processing_Matrix_Computer Vision - Fatal编程技术网

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

如何在三维图像中找到所有点(或区域),其中前两个维度显示分辨率,第三个维度显示密度?我可以使用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     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函数能够提取唯一的行,并将相同的标签分配给彼此相等的行

这里variable
F
捕获作为每行标签的唯一函数的第三个输出

F =

   1
   4
   6
   2
   5
   5
   3
   5
   5
应该将其重塑为2D

结果=

1   2   3
4   5   5
6   5   5
<