Hello Mat

 找回密码
 立即注册
查看: 4305|回复: 1

ICA图像独立主成分分析

[复制链接]

1298

主题

1524

帖子

114

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22653
发表于 2016-10-23 22:22:17 | 显示全部楼层 |阅读模式
参考链接:
http://wenku.baidu.com/link?url= ... 0lJ4dJYRj8CSqWHjBae
http://wenku.baidu.com/link?url= ... 0lJ4dJYRj8CSqWHjBae
http://wenku.baidu.com/view/1578be42336c1eb91a375d0e.html

源信号s --> 混合矩阵A --> 中心化、白化-->分离矩阵-->分离信号Y

具体的实现代码如下:
  1. clc,clear,close all
  2. warning off
  3. %读取和显示图像
  4. I00= imread('1.bmp');
  5. I01= imread('2.bmp');
  6. I02= imread('3.bmp');
  7. I1=rgb2gray(I00); I1 = imresize(I1,[256,256]);
  8. I2=rgb2gray(I01); I2 = imresize(I2,[256,256]);
  9. I3=rgb2gray(I02); I3 = imresize(I3,[256,256]);
  10. figure(1)
  11. subplot(321),imshow(I1),
  12. subplot(322),imhist(I1),
  13. subplot(323),imshow(I2),
  14. subplot(324),imhist(I2),
  15. subplot(325),imshow(I3),
  16. subplot(326),imhist(I3),

  17. %对信号进行随机混合得到仿真观测信号
  18. s1=reshape(I1,[1,256*256]);
  19. s2=reshape(I2,[1,256*256]);
  20. s3=reshape(I3,[1,256*256]);
  21. %将s1、s2、s3变换成一个1*65536的行矩阵
  22. s1=reshape(I1,[1,256*256]);
  23. s2=reshape(I2,[1,256*256]);
  24. s3=reshape(I3,[1,256*256]);     % 将s1、s2、s3变换成一个1*65536的行矩阵
  25. s=[s1;s2;s3];                       % s为一个3*65536的矩阵
  26. sig=double(s);                     % sig为一个double型的矩阵
  27. A=rand(size(sig,1));             % 生成一个大小为3*3,取值在0-1之间的随机矩阵
  28. mixedsig=A*sig;                  % 混合信号为一个3*65535的矩阵
  29. ms1=reshape(mixedsig(1,:),[256,256]);
  30. ms2=reshape(mixedsig(2,:),[256,256]);
  31. ms3=reshape(mixedsig(3,:),[256,256]);    % 将ms1、ms2、ms3四舍五入转换成无符号整型数
  32. MI1=uint8(round(ms1));
  33. MI2=uint8(round(ms2));
  34. MI3=uint8(round(ms3));
  35. %显示混合图像?figure(2)?
  36. subplot(131),imshow(MI1),title('混合图片1');
  37. subplot(132),imshow(MI2),title('混合图片2');
  38. subplot(133),imshow(MI3),title('混合图片3');
  39. mixeds_bak=mixedsig;                                        % 将混合后的数据备份,以便在恢复时直接调用
  40. mixeds_mean=zeros(3,1);                                   % 标准化
  41. for i=1:3
  42.     mixeds_mean(i)=mean(mixedsig(i,:));
  43. end                                                                      % 计算mixedsig的均值和方差
  44. for i=1:3
  45.     for j=1:size(mixedsig,2)
  46.         mixedsig(i,j)=mixedsig(i,j)-mixeds_mean(i);
  47.     end
  48. end  %白化
  49. mixeds_cov=cov(mixedsig');     % cov为求协方差的函数
  50. [E,D]=eig(mixeds_cov);            % 对图片矩阵的协方差函数进行特征值分解
  51. Q=inv(sqrt(D))*(E)';                 % Q为白化矩阵
  52. mixeds_white=Q*mixedsig;      %  mixeds_white为白化后的图片矩阵
  53. I=cov(mixeds_white');               % I应为单位阵
  54. %%%%%%%%%%%%%%%%%%FastICA算法%%%%%%%%%%%%%%%%%%%%%%%%%%?
  55. X=mixeds_white;%以下对X进行操作
  56. [variablenum,samplenum]=size(X);
  57. numofIC=variablenum;%在此应用中,独立元个数等于变量个数
  58. B=zeros(numofIC,variablenum);%初始化列向量b的寄存矩阵,B=[b1,b2,??,bd]
  59. for r=1:numofIC
  60.     i=1;
  61.     maxiterationsnum=150;%设置最大迭代次数
  62.     b=2*(rand(numofIC,1)-.5);%随机设置b的初值
  63.     b=b/norm(b);%对b标准化
  64.     while i<=maxiterationsnum+1
  65.         if i==maxiterationsnum %循环结束处理
  66.             fprintf('\n?第%d分量在%d次迭代内并不收敛.',r,maxiterationsnum);
  67.             break;
  68.         end
  69.         bold=b;%初始化前一步b的寄存器
  70.         u=1;
  71.         t=X'*b;
  72.         g=t.^3;
  73.         dg=3*t.^2;
  74.         b=((1-u)*t'*g*b+u*X*g)/samplenum-mean(dg)*b;%核心公式
  75.         b=b-B*B'*b; % 对b正交化
  76.         b=b/norm(b);
  77.         if abs(abs(b'*bold)-1)<1e-9   % 如果收敛,则
  78.             B(:,r)=b;%保存所得向量b
  79.             break;
  80.         end
  81.         i=i+1;
  82.     end
  83. end
  84. %数据复原?
  85. ICAeds=B'*Q*mixeds_bak;
  86. ICAeds_bak=ICAeds;
  87. ICAeds=abs(55*ICAeds);

  88. Is1=reshape(ICAeds(1,:),[256,256]);
  89. Is2=reshape(ICAeds(2,:),[256,256]);
  90. Is3=reshape(ICAeds(3,:),[256,256]);
  91. II1=uint8(round(Is1));
  92. II2=uint8(round(Is2));
  93. II3=uint8(round(Is3)); %显示分离后的图像
  94. figure(3)
  95. subplot(321),imshow(II1),title('分离出的图片1'),
  96. subplot(322),imhist(II1),title('分离图片1的直方图');
  97. subplot(323),imshow(II2),title('分离出的图片2'),
  98. subplot(324),imhist(II2),title('分离图片2的直方图');
  99. subplot(325),imshow(II3),title('分离出的图片3'),
  100. subplot(326),imhist(II3),title('分离图片3的直方图');
  101. III1=imsubtract(I1,II1);
  102. III2=imsubtract(I2,II2);
  103. III3=imsubtract(I3,II3);
  104. %显示分离后的图片与原图的差值图以及对应的直方图%
  105. figure(4)
  106. subplot(321),imshow(III1),title('差值图片1'),
  107. subplot(322),imhist(III1),title('差值图片1的直方图');
  108. subplot(323),imshow(III2),title('差值图片2'),
  109. subplot(324),imhist(III2),title('差值图片2的直方图');
  110. subplot(325),imshow(III3),title('差值图片3'),
  111. subplot(326),imhist(III3),title('差值图片3的直方图');
复制代码



算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

1298

主题

1524

帖子

114

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22653
 楼主| 发表于 2016-12-24 20:53:33 | 显示全部楼层
ICA各类程序汇总,打包下载如下:
链接:http://pan.baidu.com/s/1o8Iwy2u 密码:tw0w
具体参见链接如下:
http://halcom.cn/forum.php?mod=v ... 1&extra=#pid229
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-5-19 02:37 , Processed in 0.217461 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表