利用matlab实现两个矩阵M1与M2之间的CWNN变化检测,并把结果展示出来
时间: 2023-06-11 10:06:11 浏览: 98
CWNN(Change-Weighted Nearest Neighbor)变化检测算法是一种基于像素差异和颜色变化的方法,用于检测两幅图像之间的变化。在Matlab中实现CWNN算法,可以按照以下步骤进行:
1. 读取两幅待比较的图像,并将它们转换为Lab色彩空间。
```matlab
I1 = imread('image1.jpg');
I2 = imread('image2.jpg');
I1 = rgb2lab(I1);
I2 = rgb2lab(I2);
```
2. 计算两幅图像的像素差异,并将结果保存在矩阵D中。
```matlab
D = abs(I1 - I2);
```
3. 计算每个像素的变化权重,即对于每个像素i,计算其邻域内像素的差异绝对值之和,并将结果保存在矩阵W中。
```matlab
W = zeros(size(I1,1),size(I1,2));
for i = 1:size(I1,1)
for j = 1:size(I1,2)
if i>1 && j>1 && i<size(I1,1) && j<size(I1,2)
W(i,j) = sum(sum(D(i-1:i+1,j-1:j+1)));
end
end
end
```
4. 对于每个像素i,在其邻域内寻找与它最相似的像素j,并将j的权值保存在矩阵N中。
```matlab
N = zeros(size(I1,1),size(I1,2));
for i = 1:size(I1,1)
for j = 1:size(I1,2)
if i>1 && j>1 && i<size(I1,1) && j<size(I1,2)
subW = W(i-1:i+1,j-1:j+1);
subW(2,2) = max(max(subW));
[minW,minInd] = min(subW(:));
[minRow,minCol] = ind2sub(size(subW),minInd);
N(i,j) = subW(minRow,minCol);
end
end
end
```
5. 对于每个像素i,如果其权值大于邻域内最小权值的一定倍数(如2),则认为该像素发生了变化,否则认为未发生变化。
```matlab
threshold = 2; % 变化阈值
result = zeros(size(I1,1),size(I1,2));
for i = 1:size(I1,1)
for j = 1:size(I1,2)
if i>1 && j>1 && i<size(I1,1) && j<size(I1,2)
subN = N(i-1:i+1,j-1:j+1);
subN(2,2) = max(max(subN));
minN = min(subN(:));
if N(i,j) > threshold*minN
result(i,j) = 255; % 变化标记为白色
end
end
end
end
```
6. 将变化结果可视化。
```matlab
subplot(1,3,1);imshow(I1);title('Image 1');
subplot(1,3,2);imshow(I2);title('Image 2');
subplot(1,3,3);imshow(result);title('Change Detection');
```
完整代码如下:
```matlab
% 读取两幅图像并转换为Lab色彩空间
I1 = imread('image1.jpg');
I2 = imread('image2.jpg');
I1 = rgb2lab(I1);
I2 = rgb2lab(I2);
% 计算像素差异
D = abs(I1 - I2);
% 计算变化权重
W = zeros(size(I1,1),size(I1,2));
for i = 1:size(I1,1)
for j = 1:size(I1,2)
if i>1 && j>1 && i<size(I1,1) && j<size(I1,2)
W(i,j) = sum(sum(D(i-1:i+1,j-1:j+1)));
end
end
end
% 计算最相似像素的权值
N = zeros(size(I1,1),size(I1,2));
for i = 1:size(I1,1)
for j = 1:size(I1,2)
if i>1 && j>1 && i<size(I1,1) && j<size(I1,2)
subW = W(i-1:i+1,j-1:j+1);
subW(2,2) = max(max(subW));
[minW,minInd] = min(subW(:));
[minRow,minCol] = ind2sub(size(subW),minInd);
N(i,j) = subW(minRow,minCol);
end
end
end
% 变化检测
threshold = 2; % 变化阈值
result = zeros(size(I1,1),size(I1,2));
for i = 1:size(I1,1)
for j = 1:size(I1,2)
if i>1 && j>1 && i<size(I1,1) && j<size(I1,2)
subN = N(i-1:i+1,j-1:j+1);
subN(2,2) = max(max(subN));
minN = min(subN(:));
if N(i,j) > threshold*minN
result(i,j) = 255; % 变化标记为白色
end
end
end
end
% 可视化结果
subplot(1,3,1);imshow(I1);title('Image 1');
subplot(1,3,2);imshow(I2);title('Image 2');
subplot(1,3,3);imshow(result);title('Change Detection');
```
阅读全文