Ⅰ 求助誰有基於模糊C均值的圖像分割的代碼
unction [U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)
% 模糊 C 均值聚類 FCM: 從隨機初始化劃分矩陣開始迭代
% [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm(Data,C,plotflag,M,epsm)
% 輸入:
% Data: N×S 型矩陣,聚類的原始數據,即一組有限的觀測樣本集,
% Data 的每一行為一個觀測樣本的特徵矢量,S 為特徵矢量
% 的維數,N 為樣本點的個數
% C: 聚類數,1<C<N
% plotflag: 聚類結果 2D/3D 繪圖標記,0 表示不繪圖,為預設值
% M: 加權指數,預設值為 2
% epsm: FCM 演算法的迭代停止閾值,預設值為 1.0e-6
% 輸出:
% U: C×N 型矩陣,FCM 的劃分矩陣
% P: C×S 型矩陣,FCM 的聚類中心,每一行對應一個聚類原型
% Dist: C×N 型矩陣,FCM 各聚類中心到各樣本點的距離,聚類中
% 心 i 到樣本點 j 的距離為 Dist(i,j)
% Cluster_Res: 聚類結果,共 C 行,每一行對應一類
% Obj_Fcn: 目標函數值
% iter: FCM 演算法迭代次數
% See also: fuzzydist maxrowf fcmplot
Data=imread('qq.jpg');
C=10;%%
if nargin<5
epsm=1.0e-6;
end
if nargin<4
M=2;
end
if nargin<3
plotflag=0;
end
[N,S]=size(Data);
m=2/(M-1);
iter=0;
Dist(C,N)=0;
U(C,N)=0;
P(C,S)=0;
% 隨機初始化劃分矩陣
U0 = rand(C,N);
U0=U0./(ones(C,1)*sum(U0));
% FCM 的迭代演算法
while true
% 迭代計數器
iter=iter+1;
% 計算或更新聚類中心 P
Data=uint8(Data);
P=uint8(P);
Um=U0.^M; Um=uint8(Um);
P=Um.*Data./(ones(S,1).*sum(Um'))'; %錯誤行
% 更新劃分矩陣 U
for i=1:C
for j=1:N
Dist(i,j)=fuzzydist(P(i,:),Data(j,:));
end
end
U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));
% 目標函數值: 類內加權平方誤差和
if nargout>4 || plotflag
Obj_Fcn(iter)=sum(sum(Um.*Dist.^2));
end
% FCM 演算法迭代停止條件
if norm(U-U0,Inf)<epsm
break
end
U0=U;
end
% 聚類結果
if nargout > 3
res = maxrowf(U);
for c = 1:C
v = find(res==c);
Cluster_Res(c,1:length(v))=v;
end
end
% 繪圖
if plotflag
fcmplot(Data,U,P,Obj_Fcn);
end
function
[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm2(Data,P0,plotflag,M,epsm)
% 模糊 C 均值聚類 FCM: 從指定初始聚類中心開始迭代
% [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm2(Data,P0,plotflag,M,epsm)
% 輸入: Data,plotflag,M,epsm: 見 fuzzycm.m
% P0: 初始聚類中心
% 輸出: U,P,Dist,Cluster_Res,Obj_Fcn,iter: 見 fuzzycm.m
% See also: fuzzycm
if nargin<5
epsm=1.0e-6;
end
if nargin<4
M=2;
end
if nargin<3
plotflag=0;
end
[N,S] = size(Data);
m = 2/(M-1);
iter = 0;
C=size(P0,1);
Dist(C,N)=0;
U(C,N)=0;
P(C,S)=0; % FCM 的迭代演算法
while true % 迭代計數器
iter=iter+1; % 計算或更新劃分矩陣 U
for i=1:C
for j=1:N
Dist(i,j)=fuzzydist(P0(i,:),Data(j,:));
end
end
U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m)))); % 更新聚類中心 P
Um=U.^M;
P=Um*Data./(ones(S,1)*sum(Um'))'; % 目標函數值: 類內加權平方誤差和
if nargout>4 | plotflag
Obj_Fcn(iter)=sum(sum(Um.*Dist.^2));
end % FCM 演算法迭代停止條件
if norm(P-P0,Inf)<epsm
break
end
P0=P;
end % 聚類結果
if nargout > 3
res = maxrowf(U);
for c = 1:C
v = find(res==c);
Cluster_Res(c,1:length(v))=v;
end
end
% 繪圖
if plotflag
fcmplot(Data,U,P,Obj_Fcn);
end
function f = addr(a,strsort)
% 返迴向量升序或降序排列後各分量在原始向量中的索引
% 函數調用:f = addr(a,strsort)
% strsort: 'ascend' or 'descend'
% default is 'ascend'
% -------- example --------
% addr([ 4 5 1 2 ]) returns ans:
% [ 3 4 1 2 ]
if nargin==1
strsort='ascend';
end
sa=sort(a);
ca=a;
la=length(a);
f(la)=0;
for i=1:la
f(i)=find(ca==sa(i),1);
ca(f(i))=NaN;
end
if strcmp(strsort,'descend')
f=fliplr(f);
end
function ellipse(a,b,center,style,c_3d)
% 繪制一個橢圓
% 調用: ellipse(a,b,center,style,c_3d)
% 輸入:
% a: 橢圓的軸長(平行於 x 軸)
% b: 橢圓的軸長(平行於 y 軸)
% center: 橢圓的中心 [x0,y0],預設值為 [0,0]
% style: 繪制的線型和顏色,預設值為實線藍色
% c_3d: 橢圓的中心在 3D 空間中的 z 軸坐標,可預設
if nargin<4
style='b';
end
if nargin<3 | isempty(center)
center=[0,0];
end
t=1:360;
x=a/2*cosd(t)+center(1);
y=b/2*sind(t)+center(2);
if nargin>4
plot3(x,y,ones(1,360)*c_3d,style)
else
plot(x,y,style)
end
function fcmplot(Data,U,P,Obj_Fcn)
% FCM 結果繪圖函數
% See also: fuzzycm maxrowf ellipse
[C,S] = size(P);
res = maxrowf(U);
str = 'po*x+d^v><.h';
% 目標函數繪圖
figure(1),plot(Obj_Fcn)
title('目標函數值變化曲線','fontsize',8)
% 2D 繪圖
if S==2
figure(2),plot(P(:,1),P(:,2),'rs'),hold on
for i=1:C
v=Data(find(res==i),:);
plot(v(:,1),v(:,2),str(rem(i,12)+1))
ellipse(max(v(:,1))-min(v(:,1)), ...
max(v(:,2))-min(v(:,2)), ...
[max(v(:,1))+min(v(:,1)), ...
max(v(:,2))+min(v(:,2))]/2,'r:')
end
grid on,title('2D 聚類結果圖','fontsize',8),hold off
end
% 3D 繪圖
if S>2
figure(2),plot3(P(:,1),P(:,2),P(:,3),'rs'),hold on
for i=1:C
v=Data(find(res==i),:);
plot3(v(:,1),v(:,2),v(:,3),str(rem(i,12)+1))
ellipse(max(v(:,1))-min(v(:,1)), ...
max(v(:,2))-min(v(:,2)), ...
[max(v(:,1))+min(v(:,1)), ...
max(v(:,2))+min(v(:,2))]/2, ...
'r:',(max(v(:,3))+min(v(:,3)))/2)
end
grid on,title('3D 聚類結果圖','fontsize',8),hold off
end
function D=fuzzydist(A,B)
% 模糊聚類分析: 樣本間的距離
% D = fuzzydist(A,B)
D=norm(A-B);
function mr=maxrowf(U,c)
% 求矩陣 U 每列第 c 大元素所在行,c 的預設值為1
% 調用格式: mr = maxrowf(U,c)
% See also: addr
if nargin<2
c=1;
end
N=size(U,2);mr(1,N)=0;
for j=1:N
aj=addr(U(:,j),'descend');
mr(j)=aj(c);
end
[MH MW]=textread('C:\Users\Administrator\Desktop\MALE.txt','%f %f');
Data(1:50,1)=FH;
Data(51:100,1)=MH;
Data(1:50,2)=FW;
Data(51:100,2)=MW;
C=input('????C??')
[U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C)
plot(Data(:,1), Data(:,2),'o');
hold on;
maxU = max(U);
index1 = find(U(1,:) == maxU);
index2 = find(U(2,:) == maxU);
line(Data(index1,1),Data(index1,2),'marker','*','color','g');
line(Data(index2,1),Data(index2,2),'marker','*','color','r');
plot([P([1 2],1)],[P([1 2],2)],'*','color','k')
hold off;
Ⅱ 怎麼用c或者是c++實現圖像的分割(一幅完整的圖像只輸出圖像的下半部分) 謝謝!!!
用windows自帶的函數先打開圖片文件,把它的下面畫到窗口,然後再保存。(或者直接操作圖片文件的數據。bmp文件的數據結構很簡單的,完全可以直接操作)
Ⅲ C 語言: 計算圖片分割功能; x 由鍵盤輸入,實數。怎麼樣
大哥們,什麼叫做喜歡,一個女的我們之間一直聊天,,她發信息我幾乎秒回,只要她不會休息我的有些煩躁,想看她回沒回 【圖片】
Ⅳ 兩個像素0和1的模糊C均值聚類演算法的圖像分割,具體代碼,越快越詳細越好,請各位高手賜教!
232332
Ⅳ 聚類的圖像分割演算法
《C語言數值演算法程序大全》第二版,定價88元,樓主掏點金子吧,我手頭有一本,不過你看不著。
Ⅵ 跪求 C語言圖像分割和邊緣檢測 程序
clude<stdio.h>
int main()
{
int len=0;
int len2=0;
FILE* stream;
FILE* stream1;
FILE* stream2;
char buf[50];
char buf1[50];
char buf2[50];
char text[1024];
printf("input anfile path to open:");
scanf("%s",buf);
stream=fopen(buf,"r+");
fseek(stream,0,SEEK_END);
len=ftell(stream);
printf("the file %s length is %d!\n",buf,len);
len2 = len/2;
printf("intput 2 file name: \n");
scanf("%s%s",buf1,buf2);
fseek(stream,0,SEEK_SET);
stream1=fopen(buf1,"w+");
stream2=fopen(buf2,"w+");
fread(text,len2,1,stream);
fwrite(text,len2,1,stream1);
fread(text,len-len2,1,stream);
fwrite(text,len-len2,1,stream2);
fclose(stream);
fclose(stream1);
fclose(stream2);
return 0;
}
文件合並
#include<stdio.h>
int main()
{
int len=0;
int len2=0;
FILE* stream;
FILE* stream1;
char buf[50];
char buf1[50];
char text[1024];
printf("input anfile path to open:");
scanf("%s",buf);
stream=fopen(buf,"r+");
fseek(stream,0,SEEK_END);
printf("intput another file name: \n");
scanf("%s",buf1);
stream1=fopen(buf1,"r+");
fseek(stream1,0,SEEK_END);
len=ftell(stream1);
fseek(stream1,0,SEEK_SET);
fread(text,len,1,stream1);
fwrite(text,len,1,stream);
fclose(stream);
fclose(stream1);
remove(buf1);//remove the another file
return 0;
}
需要在程序目錄下有文件存在
另外,虛機團上產品團購,超級便宜
Ⅶ 求一個用C語言寫的基於K-means聚類的圖像分割代碼
基於Kmeans圖像分割
..................\程序
..................\....\ChildFrm.cpp
..................\....\ChildFrm.h
..................\....\Debug
..................\....\Dib.cpp
..................\....\Dib.h
..................\....\MainFrm.cpp
..................\....\MainFrm.h
..................\....\ReadMe.txt
..................\....\res
..................\....\...\trace.rc2
..................\....\Resource.h
..................\....\StdAfx.cpp
..................\....\StdAfx.h
..................\....\trace.aps
..................\....\trace.clw
..................\....\trace.cpp
..................\....\trace.dsp
..................\....\trace.dsw
..................\....\trace.h
..................\....\trace.ncb
..................\....\trace.opt
..................\....\trace.plg
..................\....\trace.rc
..................\....\traceDoc.cpp
..................\....\traceDoc.h
..................\....\traceView.cpp
..................\....\traceView.h
Ⅷ 怎麼利用模糊C均值聚類實現圖像分割啊具體代碼
%%%%%%%%%%%%%%%模糊聚類%%%%%%%%%%%%%%%%%%%%%%%
clear;
load F:\從0開始\數據\data.txt;
INPUTDATA=data;
%--------原始數據標准化-------%
disp('請選擇原始數據標准化方式: ');
disp('<1-總和標准化|2-標准差標准化|3-極大值標准化|4-極差標准化>');
wayforstand=input('請輸入: ');
switch wayforstand
case 1,
DATAFORCLUS=standard_use_sum(INPUTDATA);
case 2,
DATAFORCLUS=standard_use_std(INPUTDATA);
case 3,
DATAFORCLUS=standard_use_max(INPUTDATA);
case 4,
DATAFORCLUS=standard_use_jc(INPUTDATA);
otherwise
error('您的輸入不符合要求->執行結束!!!');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%基於模糊等價關系的模糊聚類%%%%%%%%%%%%%%%%%%%%%%
%----------構造相似關系-----------%
numrows=size(DATAFORCLUS,1);
numcols=size(DATAFORCLUS,2);
disp('請選擇對象之間相似性統計量的方式: ');
disp('<1-相關系數法|2-夾角餘弦法|3-指數相似系數法|4-絕對值指數法|5-算術平均最小法|6-最大最小值法|7-絕對值差數法|8-數量積法>');
wayforr_ij=input('請輸入: ');
switch wayforr_ij
case 1, %-----------------------------------相關系數法
for i=1:numrows,
for j=1:numrows,
meani=mean(DATAFORCLUS(i,:));meanj=mean(DATAFORCLUS(j,:));
simiR(i,j)=sum((DATAFORCLUS(i,:)-meani).*(DATAFORCLUS(j,:)-meanj))/...
(sqrt(sum((DATAFORCLUS(i,:)-meani).^2))*sqrt(sum((DATAFORCLUS(j,:)-meanj).^2)));
end
end
case 2, %-----------------------------------夾角餘弦法
for i=1:numrows,
for j=1:numrows,
simiR(i,j)=sum(DATAFORCLUS(i,:).*DATAFORCLUS(j,:))/...
(sqrt(sum(DATAFORCLUS(i,:).*DATAFORCLUS(i,:)))*sqrt(sum(DATAFORCLUS(j,:).*DATAFORCLUS(j,:))));
end
end
case 3, %-----------------------------------指數相似系數法
case 4, %-----------------------------------絕對值指數法
case 5, %-----------------------------------算術平均最小法
case 6, %-----------------------------------最大最小值法
case 7, %-----------------------------------絕對值差數法
case 8, %-----------------------------------數量積法
otherwise
error('您的輸入不符合要求->執行結束!!!');
end
%-------改造成等價關系----------%
sign=0;
numselfmul=1;
simiRk=eye(numrows);
equi_tem=simiR;
while sign==0,
for i=1:numrows,
for j=1:numrows,
for c=1:numrows,
rij_temp(c)=min([equi_tem(i,c) equi_tem(c,j)]);
end
simiRk(i,j)=max(rij_temp);
end
end
%--------------%
if sum(sum(simiRk-equi_tem,1))~=0,
numselfmul=numselfmul+1;
equi_tem=simiRk;
else
sign=1;
break
end
%--------------%
end
if sign==1,
disp('從相似矩陣到等價矩陣改造成功!!!');
else
disp('從相似矩陣到等價矩陣改造失敗!!!');
end
equiR=simiRk;
numclass=input('請輸入聚類數: ');
%---------在不同的截集水平進行聚類--------------%
clasc=0;
comp_vec(1,1:numrows)=0;
index=0;
clasc=0;
tip=0;
alpha=0;
temnumeachclass=0;
while (tip==0),
%alpha=input('請輸入進行分類的截集水平λ: ');
%alpha=0.5; %調試
if (alpha<0 || alpha>1),
error('您輸入的截集水平λ不符合分類要求->執行結束!!!');
end
comp_arr=ones(numrows)*alpha;
result_arr=(equiR>=comp_arr); %--------------------result_arr判斷矩陣
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%撿菜演算法
for i=1:numrows,
if sum(comp_vec(1,:)==result_arr(i,:))<numrows, %-----------說明沒有歸類
temnumeachclass=0;
%numeachclass(clasc)=index-temnumeachclass;
temsave=result_arr(i,:);
for j=1:numrows,
if sum(result_arr(j,:)==temsave)==numrows,
index=index+1;
class(index)=j;
result_arr(j,:)=0; %--------------------說明已經被歸類
temnumeachclass=temnumeachclass+1;
end
end
clasc=clasc+1;
nec(clasc)=temnumeachclass;
else
continue;
end
end
if clasc>=numclass,
tip=1; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%當模糊分類的數目小於等於所給出的類數時退出循環體
disp('成功!!!');
else
clear class;
clear numeachclass;
clear nec;
clasc=0;
index=0;
temnumeachclass=0;
alpha=alpha+0.01;
end
end
%----取聚類結果----%
num=0;
n=0;
for i=1:clasc,
for j=1:nec(i),
num=num+1;
n=n+1;
CLUS(n,:)=INPUTDATA(class(num),:);
end
n=n+1;
CLUS(n,:)=inf;
end
%format single(CLUS)
lenexport=size(CLUS,1);
for i=1:lenexport,
RESULT(i,:)=sprintf('%15.2f',CLUS(i,:));
end
RESULT
Ⅸ 哥呀 幫我用C語言寫煙霧圖像濾波然後分割的程序 我付錢給你行嗎
難度較大,坐等高人
Ⅹ 如何用matlab編程實現指紋圖像的分割與細化
/*
財主^_^,20分也要
*/
#include "stdio.h"
#include "string.h"
int main(int argc, char* argv[])
{
int i;
char str[255];
printf( "Please input the string:");
gets( str );
for( i = strlen( str ) - 1 ; i >= 0 ; i-- )
{
printf( "%c" , str[i] );
}
printf( "\n" );
return 0;
}