两个图像之间的差异Matlab
Difference between two images Matlab
我有两张图像 A
和 B
,大小为 200x400
。两个图像中的像素(单元格值)的值范围仅为 1-20。 A
是正确的图像,每个像素都有正确的值。我想要做的是检查图像 A
中具有每个值 (1-20) 的像素,并将其与图像 B
中的相应值进行比较。因此,例如,我将检查图像 A
中具有值 1
的像素,然后将检查图像 B
中的那些像素并检查这些像素的值 (1-20) .然后将对其余值 (2-20) 执行相同的操作。
之后想把结果的混淆矩阵保存到矩阵C
.
所以如果 A
是这样的:
2 3 4 5 6 7 8
4 1 1 1 1 1 3
3 1 1 1 1 1 6
6 1 1 1 1 1 4
6 1 1 1 1 1 2
2 3 4 5 6 7 8
和B
是这样的:
2 3 4 5 6 7 8
4 2 1 1 4 1 3
3 4 1 8 1 1 6
6 1 2 7 1 1 4
6 1 1 5 4 1 2
2 3 4 5 6 7 8
我想检查图像 A
中值为 1
的像素与矩阵 B
中的相同像素。这意味着我要处理的像素是图像 A
中的这个 1 框和图像 B
.
中的相应像素
C 看起来像这样(只会填充 1
的行,因为这是我给出的简单示例):
1 2 3 4 5 6 7 8 9 ... 20
1 12 2 0 3 1 0 1 1 0 ...
2
3
4
5
6
7
8
9
.
.
.
20
所以你可以在图像 A
中有 20 个像素具有值 1
但图像 B
中相应的像素有 12 个,2 个二,3 个四,1五、一七和一八。
所以这个矩阵C
将逐行填充行号像素中每个列号的出现次数。
因此,如果有人可以建议如何在 Matlab 中完成此操作,如果需要更多说明,也请告诉我。
这可以通过 accumarray
来完成:
N = 20; %// possible pixel values are 1,2,...,N
result = accumarray(A(:), B(:), [N 1], ...
@(x){reshape(histc(x, 1:N),[],1)}, {zeros(N,1)});
%// each cell contains one row of the result matrix
%// reshape needed because histc may output a row or a column vector
%// (Note: fill value of accumarray can also be a cell)
result = [result{:}].'; %'// concatenate all cells into result matrix
或者更简单地使用sparse
的累积能力:
result = full(sparse(A(:), B(:), 1, N, N));
如果像素可能有0
值,只需将1
添加到A
、B
和N
:
result = accumarray(A(:)+1, B(:)+1, [N+1 1], ...
@(x){reshape(histc(x, 1:N+1),[],1)}, {zeros(N+1,1)});
result = [result{:}].';
或者
result = full(sparse(A(:)+1, B(:)+1, 1, N+1, N+1));
我有两张图像 A
和 B
,大小为 200x400
。两个图像中的像素(单元格值)的值范围仅为 1-20。 A
是正确的图像,每个像素都有正确的值。我想要做的是检查图像 A
中具有每个值 (1-20) 的像素,并将其与图像 B
中的相应值进行比较。因此,例如,我将检查图像 A
中具有值 1
的像素,然后将检查图像 B
中的那些像素并检查这些像素的值 (1-20) .然后将对其余值 (2-20) 执行相同的操作。
之后想把结果的混淆矩阵保存到矩阵C
.
所以如果 A
是这样的:
2 3 4 5 6 7 8
4 1 1 1 1 1 3
3 1 1 1 1 1 6
6 1 1 1 1 1 4
6 1 1 1 1 1 2
2 3 4 5 6 7 8
和B
是这样的:
2 3 4 5 6 7 8
4 2 1 1 4 1 3
3 4 1 8 1 1 6
6 1 2 7 1 1 4
6 1 1 5 4 1 2
2 3 4 5 6 7 8
我想检查图像 A
中值为 1
的像素与矩阵 B
中的相同像素。这意味着我要处理的像素是图像 A
中的这个 1 框和图像 B
.
C 看起来像这样(只会填充 1
的行,因为这是我给出的简单示例):
1 2 3 4 5 6 7 8 9 ... 20
1 12 2 0 3 1 0 1 1 0 ...
2
3
4
5
6
7
8
9
.
.
.
20
所以你可以在图像 A
中有 20 个像素具有值 1
但图像 B
中相应的像素有 12 个,2 个二,3 个四,1五、一七和一八。
所以这个矩阵C
将逐行填充行号像素中每个列号的出现次数。
因此,如果有人可以建议如何在 Matlab 中完成此操作,如果需要更多说明,也请告诉我。
这可以通过 accumarray
来完成:
N = 20; %// possible pixel values are 1,2,...,N
result = accumarray(A(:), B(:), [N 1], ...
@(x){reshape(histc(x, 1:N),[],1)}, {zeros(N,1)});
%// each cell contains one row of the result matrix
%// reshape needed because histc may output a row or a column vector
%// (Note: fill value of accumarray can also be a cell)
result = [result{:}].'; %'// concatenate all cells into result matrix
或者更简单地使用sparse
的累积能力:
result = full(sparse(A(:), B(:), 1, N, N));
如果像素可能有0
值,只需将1
添加到A
、B
和N
:
result = accumarray(A(:)+1, B(:)+1, [N+1 1], ...
@(x){reshape(histc(x, 1:N+1),[],1)}, {zeros(N+1,1)});
result = [result{:}].';
或者
result = full(sparse(A(:)+1, B(:)+1, 1, N+1, N+1));