计算机视觉

目录

一、图像处理

main

denoise

二、Harris角点检测

三、Hough变换直线检测

四、直方图显著性检测

五、人脸识别

六、kmeans

import

函数

kmeanstext

七、神经网络


常用函数:

imread----------读取图像
imshow---------显示图像
rgb2hsv---------RGB转HSV
hsv2rgb---------HSV转RGB
imhist-----------显示图像直方图
rgb2gray-------彩色图转灰度图
imnoise--------对图像添加噪声
fspecial--------构建均值滤波模板
imfilter--------均值滤波函数
imgaussfilt-----高斯滤波函数
 

一、图像处理

main


clc
clear all
img = double(imread('Fig1.bmp'));

R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);

figure(1);
subplot(2,2,1), imshow(uint8(img)),title('原图');
subplot(2,2,2), imshow(uint8(R));title('R分量图');
subplot(2,2,3), imshow(uint8(G));title('B分量图');
subplot(2,2,4), imshow(uint8(B));title('B分量图');
%rgb2hsv
img_hsv = rgb2hsv(img);
img_hsv(:,:,1) = img_hsv(:,:,1)*3;
img_hsv(:,:,2) = img_hsv(:,:,2);
img_hsv(:,:,3) = img_hsv(:,:,3);
img_rgbh = hsv2rgb(img_hsv);

img_hsv = rgb2hsv(img);
img_hsv(:,:,1) = img_hsv(:,:,1);
img_hsv(:,:,2) = img_hsv(:,:,2)*3;
img_hsv(:,:,3) = img_hsv(:,:,3);
img_rgbs = hsv2rgb(img_hsv);

img_hsv = rgb2hsv(img);
img_hsv(:,:,1) = img_hsv(:,:,1);
img_hsv(:,:,2) = img_hsv(:,:,2);
img_hsv(:,:,3) = img_hsv(:,:,3)*3;
img_rgbv = hsv2rgb(img_hsv);

figure(2);
subplot(2,2,1), imshow(uint8(img)),title('原图');
subplot(2,2,2), imshow(uint8(img_rgbh));title('H增强分量图');
subplot(2,2,3), imshow(uint8(img_rgbs));title('S增强分量图');
subplot(2,2,4), imshow(uint8(img_rgbv));title('V增强分量图');
%直方图

figure(3);
subplot(2,2,1), imshow(uint8(img)),title('原图');
subplot(2,2,2), imhist(uint8(img(:,:,1)));title('R分量直方图');
subplot(2,2,3), imhist(uint8(img(:,:,2)));title('B分量直方图');
subplot(2,2,4), imhist(uint8(img(:,:,3)));title('B分量直方图');

denoise

clc
clear all

img = imread('Fig6.bmp');

figure(1)
subplot(1,1,1),imshow(uint8(img)),title('原图');
img = rgb2gray(img);
%添加噪声
im_noise_g = imnoise(img, 'gaussian',0,0.01);
im_noise_s = imnoise(img, 'salt & pepper',0.03);

figure(2)
subplot(1,2,1),imshow(uint8(im_noise_g)),title('高斯噪声图');
subplot(1,2,2),imshow(uint8(im_noise_s)),title('椒盐噪声图');

%均值滤波
A_3 = fspecial('average',[3,3]);
A_9 = fspecial('average',[9,9]);

im_denoise_g_3 = imfilter(im_noise_g,A_3);
im_denoise_g_9 = imfilter(im_noise_g,A_9);

figure(3)
subplot(1,2,1),imshow(uint8(im_denoise_g_3)),title('高斯去噪图-均值—3*3');
subplot(1,2,2),imshow(uint8(im_denoise_g_9)),title('高斯去噪图-均值—9*9');

%高斯滤波

im_denoise_g_1 = imgaussfilt(im_noise_g,1);
im_denoise_g_5 = imgaussfilt(im_noise_g,5);

figure(4)
subplot(1,2,1),imshow(uint8(im_denoise_g_1)),title('高斯去噪图-高斯-1');
subplot(1,2,2),imshow(uint8(im_denoise_g_5)),title('高斯去噪图-高斯-5');

二、Harris角点检测

clear; 
% 读取图像 
grayImage = imread('1.bmp');     
% 转化为灰度图像
%grayImage=rgb2gray(srcImage);
% 求取图像宽高
[ImageHeight,ImageWidth]=size(grayImage);
% 显示原始灰度图
% imshow(ori_im);
% 方法1:x方向梯度算子(用于Harris角点提取算法) 
% fx = [-2 -1 0 1 2];
% 方法2:x方向高斯卷积核(高斯尺度空间的多尺度优化)
%fx = [5 0 -5;8 0 -8;5 0 -5]; 
fx = [1,2,1;0,0,0;-1,-2,-1];

% x方向滤波微分
Ix = filter2(fx,grayImage);            
% 显示x方向滤波图
figure;imshow(Ix);
% 方法1:y方向梯度算子(用于Harris角点提取算法) 
% fy = [-2;-1;0;1;2];      
% 方法2:y方向高斯卷积核(高斯尺度空间的多尺度优化)
 %fy = [5 8 5;0 0 0;-5 -8 -5];
 fy = [1,0,-1;2,0,-2;1,0,-1];  
 
% y方向滤波微分
Iy = filter2(fy,grayImage);
% 显示y方向滤波图
figure;imshow(Iy);
%(相关参数说明见harris理论,文中前面有链接)
Ix2 = Ix.^2; 
Iy2 = Iy.^2; 
Ixy = Ix.*Iy; 
% 产生7*7的高斯窗函数,sigma=2,用于窗口的高斯平滑 
w= fspecial('gaussian',[5 5],2);      
Ix2 = filter2(w,Ix2); 
Iy2 = filter2(w,Iy2); 
Ixy = filter2(w,Ixy); 

% 纪录角点位置,角点处值为1 
corner = zeros(ImageHeight,ImageWidth);
% 图像中最大的响应值 
Rmax = 0;                               
% 计算各点的响应值
R = zeros(ImageHeight,ImageWidth); 
for i = 1:ImageHeight 
    for j = 1:ImageWidth 
        M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)];             
        R(i,j) = det(M)-0.06*(trace(M))^2;                      
%         if R(i,j) > Rmax 
%             Rmax = R(i,j); 
%         end; 
    end; 
end; 
% 角点个数
cnt = 0; 
% 进行非极大抑制,窗口大小3*3 
for i = 2:ImageHeight-1 
    for j = 2:ImageWidth-1 
        %if ( R(i,j) > 0.01*Rmax && R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1))
        if ( R(i,j) > 20 && R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1)) 
            corner(i,j) = 1; 
            cnt = cnt+1; 
        end; 
    end; 
end; 
        
[upix, vpix] = find(corner == 1); 
%角点个数
cnt      
%绘制角点
figure;
imshow(grayImage)
hold on;
plot(vpix,upix,'r.'); 

三、Hough变换直线检测

clear; 
% 读取图像 
I = imread('1.bmp');   

subplot(2,2,1);
imshow(I);
title('原图');

BW = edge(I,'canny');
subplot(2,2,2);
imshow(BW);
title('canny算子边缘检测后图像');

%=====hough函数===============
%BW:m*n维二值图
% RhoResolution:ρ的分辨率,缺省为1
% ThetaResolution:θ的分辨率,θ的范围是[-90,90)
% H:hough变换后的累加器矩阵,行数为m,列数为n
% theta:θ
% rho:ρ  theta,rho为计算霍夫变换的角度和半径值

[H,T,R] = hough(BW);
subplot(2,2,3);
imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');
% imshow(H,[]);
title('Hough变换图');
axis on
axis normal
xlabel('\theta')
ylabel('\rho')
hold on 
%找到Hough变换结果,累加容器H中所有大于阈值Threshold的峰值中,最大的2个峰值所在的位置P。
% P为矩阵,记录H中被找到的峰值的横纵坐标。
%再hough矩阵中寻找前40个大于hough矩阵中最大值0.24倍峰值
% P = houghpeaks(H,10,'threshold',ceil(0.3*max(H(:))));  %P是峰值的坐标
P = houghpeaks(H,10);  %P是峰值的坐标

x = T(P(:,2));
y = R(P(:,1)); %由行列索引转换成实际坐标

plot(x,y,'s','color','white'); %再hough矩阵图像中标出峰值位置

%二值图BW中对应指定(theta,rho),且容器中数值>峰值P的所有线段lines
% 且线段最小长度大于MinLength
% 线段间距离<FillGap的合并
% lines为结构变量,(lines.point1,lines.point2)记录满足条件的线段端点

lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); %合并距离小于5的线段,丢弃所有长度小于7的线段

subplot(2,2,4);
imshow(I);
title('hough变换检测图');
axis on;
hold on;

% mex_len = 0;
for k=1:length(lines)  %以此标注各条直线
    xy = [lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','red');
     hold on 
%     %确定最长线段的端点
%     len = norm(lines(k).point1 - lines(k).point2); %最长线段的长度
%     if(len > max_len)
%         mex_len = len;
%         xy_long = xy;
%     end
end

% plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');

四、直方图显著性检测

%读取图像
%orpic = imread(img_name);
clear all;
clc;
close all;
orpic = imread('test2.bmp');
figure;imshow(orpic);
%获取图像的长、宽和通道值
[row ,column, nn] = size(orpic);
%生成调色板pallet(color,number),默认调色板大小为图像大小
pallet = zeros(row*column,2);
%设置阶梯值,为了将rgb量化后的结果化成一个12进制的数
w = [12*12,12,1];%RGB通道各自的权重,这里的权重不能设置为一样的,这是为了保证不一样的rgb组合得到的值不同
idx = uint32(1);%调色板像数值个数
SUM = uint32(0);%量化和
RGBSUM = zeros(row,column);%原图像为三维彩图,将RGB通道加权后每个像素的值
for i = 1 : row
   for j = 1 : column
       %获取第i行第j列的R、G、B通道的值,并量化为12阶后再转化为一个数
       a1 = floor((double(orpic(i,j,1))/255)*(12-0.0001))*w(3);  %乘以权重不一样就是为了每个通道量化后乘以权重的值不重叠了
       a2 = floor((double(orpic(i,j,2))/255)*(12-0.0001))*w(2);
       a3 = floor((double(orpic(i,j,3))/255)*(12-0.0001))*w(1);
       SUM = int32(a1) + int32(a2) + int32(a3);  %三个通道量化后颜色和作为计算相似性的依据
%        SUM = 3* int32(a1);
       RGBSUM(i,j) = SUM;
       
       %对于每个像数值,将其归类到调色板中,先在已经归类的pallet中查找,如果遍历完毕发现未归类,则将索引+1并归类
       %找出处理后的数据有多少种颜色值,以及其频数  
       
       %记录不同颜色出现的次数和出现的频率 pallet第一列是颜色 第二列是该颜色出现的次数
       if idx == 1   %第一次循环 也就是该颜色第一次出现
           pallet(idx,1) = SUM;
           pallet(idx,2) = pallet(idx,2) + 1;
           idx = idx + 1;  %颜色值+1
           continue;
       end
       flag = 0; 
       for m = 1 : idx-1   %检查有没有重复的颜色 如果没有 flag=0 里面已经有重复的颜色了,那flag=1,对应的频率值+1
           if pallet(m,1) == SUM
               pallet(m,2) = pallet(m,2) + 1;
               flag = 1;
               break;
           end
       end
       if flag == 0 
            pallet(idx,1) = SUM;
            pallet(idx,2) = pallet(idx,2) + 1;
            idx = idx + 1;
       end
    end
end
%获取图中所有的颜色值
idx = idx -1;
pallet = pallet(1:idx,:);%调色板截断,保留真实调色个数
 
%生成新的调色板num(number,color),使得颜色按照频数从大到小排列,且一号位为频数大小,二号位为处理后的颜色值
palletemp = pallet(:,2); %把频数取出来
[b,pos] = sort(palletemp,'descend'); %频数降序排列
num = zeros(idx,2);
for i = 1 : idx
    num(i,1) = b(i); %pos是降序的位置 b是对应的频数  
    num(i,2) = pallet(pos(i),1); %pos位置对应的颜色值    
     %num第一列 频数 第二列 颜色值
end
 
%计算如果要保留95%的处理后的颜色值,需要保留调色板的多少位
maxnum = idx;  %本来是257个颜色值
maxdropnum = floor(row*column*(1-0.95));  %算出覆盖面积 5% 对应多少个像素maxdropnum
crnt = num(maxnum,1); %颜色频数 (从大到小排序)这是最后一个的频数
while(crnt<maxdropnum && maxnum>1)  %覆盖面积小并且不是第一个
    crnt = crnt + num(maxnum-1,1); %crnt 累加倒数第二个颜色频率(颜色频率,也就是这个颜色有多少个像素)
    maxnum = maxnum - 1;
end  %直到颜色对应的个数大于5%的像素个数了 结束
%保证保留的颜色值个数小于256且尽量不太小
maxnum = min(maxnum,256);
if maxnum < 10
    maxnum = min(idx,100);
end
 
%将处理后的颜色值转化回RGB对应的值,此处会有+-1的误差,影响不大
 color3i = zeros(idx,3);
 for i = 1:idx  %是吧257个颜色返回
    color3i(i,1) = round(num(i,2)/w(1));
    color3i(i,2) = round(mod(num(i,2),w(1))/w(2));
    color3i(i,3) = round(mod(num(i,2),w(2)));
 end
 
%建立色板pallet(number,color,pos),其中pos为保留颜色的序号
a = zeros(idx,1);
pallet = [num,a];   %num第一列 频数 第二列 颜色值 第三列 序号
for i = 1:maxnum
    pallet(i,3) = i;
end    
 
%将舍弃的颜色归到其最相近的颜色当中
for i = (maxnum+1):idx %idx 257  原来的颜色个数 maxnum去掉95%以后的颜色个数 要把后面这么多颜色归到周围的颜色中去
    simidx = 99999999;simval = 99999999;
    for j  = 1:maxnum  %看看后面去掉的颜色和前面哪些颜色接近 计算距离
        d_ij = round((color3i(i,1)-color3i(j,1))^2 + (color3i(i,2)-color3i(j,2))^2 + (color3i(i,3)-color3i(j,3))^2);
        if d_ij < simval 
            simval = d_ij;
            simidx = j;
        end
    end  %把最小距离的颜色记录下来,那么就把i这个颜色归类到距离最小颜色
    pallet(simidx,1) = pallet(simidx,1) + pallet(i,1);  %对应的颜色频数+1
    pallet(i,3) = simidx; %保留序号  就是标记 原来的这个颜色归去第4行了 simidx = 4
end
 
%将图像中属于某一“颜色值”的所有颜色的rgb值累加之后求平均再归一,即调整保留下来颜色值
 rgbcolor = zeros(idx,4);
 for n =1:idx
     for i = 1:row
         for j = 1:column
             if RGBSUM(i,j) == pallet(n,2) %num第一列 频数 第二列 颜色值 第三列 序号
                rgbcolor(n,1) = int32(rgbcolor(n,1)) + int32(orpic(i,j,1));
                rgbcolor(n,2) = int32(rgbcolor(n,2)) + int32(orpic(i,j,2));
                rgbcolor(n,3) = int32(rgbcolor(n,3)) + int32(orpic(i,j,3));
                rgbcolor(n,4) = double(pallet(n,3));
             end
         end
     end
 end
for i = 1:maxnum %maxnum 去掉了5%的颜色个数 
    for j = (maxnum+1):idx
        if rgbcolor(j,4) == i
            rgbcolor(i,1) = (rgbcolor(i,1) + rgbcolor(j,1));
            rgbcolor(i,2) = (rgbcolor(i,2) + rgbcolor(j,2));
            rgbcolor(i,3) = (rgbcolor(i,3) + rgbcolor(j,3));
        end
    end
    rgbcolor(i,1) = (rgbcolor(i,1)/pallet(i,1))/255;
    rgbcolor(i,2) = (rgbcolor(i,2)/pallet(i,1))/255;
    rgbcolor(i,3) = (rgbcolor(i,3)/pallet(i,1))/255;
end
 
%将颜色格式由RGB转为Lab
labcolor = zeros(maxnum,3);
for i = 1:maxnum
    a = zeros(1,1,3);
    a(1,1,1) = rgbcolor(i,1);
    a(1,1,2) = rgbcolor(i,2);
    a(1,1,3) = rgbcolor(i,3);
    b = rgb2lab(a);
    labcolor(i,1) = b(1,1,1);
    labcolor(i,2) = b(1,1,2);
    labcolor(i,3) = b(1,1,3);
end
 
%存放颜色i与颜色j在Lab空间上的距离
distemp = zeros(maxnum,maxnum,2);
%每行将颜色j与颜色i的在Lab空间上的距离按从小到大排列
dist = zeros(maxnum,maxnum,2);
%存放平滑前的颜色显著值
colorsaltemp = zeros(maxnum,2);
for i = 1:maxnum
    for j = 1:maxnum
        %计算颜色i与其他所有j个颜色在Lab空间上的距离 存下来
        distemp(i,j,1) = norm(labcolor(i,:)-labcolor(j,:),2);
        distemp(i,j,2) = j;
    end
    for k = 1:maxnum
        if k == i
            continue;
        end
        %颜色i在平滑之前的颜色显著值,为S(c)=ΣP(c)D(c,a),a为其他的颜色  概率相加的显著性值
        colorsaltemp(i,1) = colorsaltemp(i,1) + (pallet(k,1)/(row*column))*distemp(i,k,1);  %num第一列 频数 第二列 颜色值 第三列 序号
        colorsaltemp(i,2) = i;
    end
    
%     [b,pos] = sort(distemp(i,:,1),'ascend');  
%     for k = 1:maxnum
%         dist(i,k,1) = b(k);
%         dist(i,k,2) = distemp(i,pos(k),2); % dist里面是按照距离排序存放的  b是距离值 pos是位置
%     end
end
 
% % %对各颜色进行平滑操作
% colorsal = zeros(maxnum,2);
% %计算权值时使用的颜色i与和其最邻近颜色的个数
% n = double(round(maxnum/4));
% %保存与颜色i在Lab空间上最相近的n=maxnum/4个点的距离的和
% totaldist = zeros(maxnum,1);
% for i = 1:maxnum
%     %计算与颜色i在Lab空间上最相近的n=maxnum/4个点的距离的和
%     for j = 2:n
%         totaldist(i,1) = totaldist(i,1) + dist(i,j,1);
%     end
%     valcrnt = 0;
%     for j = 1:n
%         valcrnt = valcrnt + colorsaltemp(dist(i,j,2),1)*(totaldist(i,1)-dist(i,j,1));  %距离差乘以距离值 作为周围四个颜色值的权重
%     end
%     colorsal(i,1) = valcrnt/((n-1)*totaldist(i,1));
%     colorsal(i,2) = i;
% end
 
%保存原图像各像素的显著值
sal = zeros(row,column);
for i = 1:row
    for j = 1:column
        for n = 1:idx
            if RGBSUM(i,j) == pallet(n,2)
                %sal(i,j) = colorsal(pallet(n,3),1);
                sal(i,j) = colorsaltemp(pallet(n,3),1);
            end
        end
    end
end
saliency = (sal - min(min(sal)))/(max(max(sal)) - min(min(sal)));
A=fspecial('gaussian',[3,3],2);  
saliency=imfilter(saliency,A,'replicate');
%显示显著性图
subplot(1,2,1),imshow(saliency); 
subplot(1,2,2),imshow(sal,[]);

%读取图像并显示原图像

将图像的RGB值量化为12阶,生成调色板(pallet)

将调色板中的颜色按照频数从大到小排列,舍弃一部分颜色

将舍弃的颜色归到最相近的颜色中,更新调色板

计算保留下来的每种颜色的平均RGB值,并转换为Lab颜色空间

计算每种颜色之间在Lab空间上的距离,得到颜色的显著性数值

将显著性数值归一化,并进行高斯平滑

显示图像的显著性结果

五、人脸识别

clear all
clc
faceDatabase= imageSet('dataSet','recursive');
%% Face detector
Fdetect= vision.CascadeObjectDetector();

[training, test]=partition(faceDatabase,[0.5,0.5]);

featureCount=1;
for i=1:size(training,2)
    for j= 1:training(i).Count
        Image= read(training(i),j);
        BB= step(Fdetect,Image);
        if(size(BB,1)==0)
            disp('problem here')
            face=Image;
        else 
            figure(1);
            imshow(Image);
            hold on 
            for ii=1:size(BB,1)
                rectangle('Position',BB(ii,:),'LineWidth',5,'LineStyle','--','EdgeColor','r');
            end
            [m, p]= max(BB(:,3));
            try
               face=imcrop(Image,BB(p,:));
            catch ME
               disp('found one');
            end
        end
        face= imresize(face,[224,224]);
        X(featureCount,:)= extractHOGFeatures(face);
        y{featureCount}= training(i).Description;
        featureCount= featureCount+1;
    end
end

disp('training Set image collected')

faceClassifier= fitcecoc(X,y);

pred= predict(faceClassifier, X);
pd=zeros(size(X,1),1);

for i=1:size(X,1)
    if(strcmp(pred{i},y{i}))
        pd(i)=1;
    end
end

fprintf('\nTraining Set Accuracy: %f\n', mean(pd) * 100);

featureCount=1;
for i=1:size(test,2)
    for j=1:test(i).Count
        Image= read(test(i),j);
        BB= step(Fdetect,Image);
       if(size(BB,1)==0)
            disp('problem here')
            face=Image;
        else 
            figure(1);
            imshow(Image);
            hold on 
            for ii=1:size(BB,1)
                rectangle('Position',BB(ii,:),'LineWidth',5,'LineStyle','--','EdgeColor','r');
            end
            [m, p]= max(BB(:,3));
            try
               face=imcrop(Image,BB(p,:));
            catch ME
               disp('found one');
            end
        end
        face= imresize(face,[224,224]);
        Xtest(featureCount,:)= extractHOGFeatures(face);
        ytest{featureCount}= test(i).Description;
        featureCount= featureCount+1;

    end
end

 disp('test Set image collected')

testPred= predict(faceClassifier, Xtest);

pdt=zeros(size(Xtest,1),1);
for i=1:size(Xtest,1)
    if(strcmp(testPred{i},ytest{i})==1)
        pdt(i)=1;
    end
end

fprintf('\nTest Set Accuracy: %f\n', mean(pdt) * 100);

六、kmeans

import

close all;   %matlab代码
clear all;
clc
k=2;
org = imread('1.jpeg');        %读入图像
figure;
subplot(2,2,1);
imshow(org),title('原始图像');    %显示原图像
% 接下来需要知道图片的尺寸(长和宽),如若直接对RGB图像进行操作,如下                   
%转化为灰度图
gray=rgb2gray(org);
[m,n]=size(gray); %m,n为所求,p=3为通道数
% 将图像进行RGB——3通道分解 % org(:, :, 1)......分别代表rgb通道
A = reshape(org(:, :, 1), m*n, 1);   
B = reshape(org(:, :, 2), m*n, 1);
C = reshape(org(:, :, 3), m*n, 1);
data = [A B C]; % r g b分量组成样本的特征,每个样本有三个属性值,共width*height个样本
% 第二张图
% kmeans第一个参数: N*P的数据矩阵,N为数据个数,P为单个数据维度
res = kmeans(double(data), k);        
result = reshape(res, m, n);             % 反向转化为图片形式
subplot(2,2,2);
% label2rgb功能是转换标记矩阵到RGB图像
imshow(label2rgb(result)),title(strcat('K=',num2str(k),'时RGB通道分割结果')); %显示分割结果
% 第三张图
res = kmeans(double(data), k+1);    
result = reshape(res, m, n);     
subplot(2,2,3);
imshow(label2rgb(result)),title(strcat('K=',num2str(k+1),'时RGB通道分割结果'));   
% 第四张图
res = kmeans(double(data), k+2);    
result = reshape(res, m, n);     
subplot(2,2,4);
imshow(label2rgb(result)),title(strcat('K=',num2str(k+2),'时RGB通道分割结果'));


函数

function [C, label, J] = kmeans(I, k) 
%C聚类中心
[m, n, p] = size(I);%图片的大小m*n,p代表RGB三层
X = reshape(double(I), m*n, p);%将I的行列排列成m*n行p列,按照列取数据的
rng('default');%将随机数生成器的设置重置为其默认值,因此会生成相同的随机数
C = X(randperm(m*n, k), :);%随机选三个聚类中心;randperm(m*n, k)-在m*n个数中,随机选择k个;X(randperm(m*n, k), :)-选取X中第k行的数据
J_prev = inf;%inf为无穷大
iter = 0; 
J = []; 
tol = 1e-11;%容忍度10^(-11)
 
while true
    iter = iter + 1;
    dist = sum(X.^2, 2)*ones(1, k) + (sum(C.^2, 2)*ones(1, m*n))' - 2*X*C';%计算图片中各个点到K个聚类中心的距离;sum(X, 2)-以行为单位求和;C'-转置;dist-mn行k列
    [~,label] = min(dist, [], 2);%label记录最小值的列数,找到dist中那些最小值的索引位置,并放在向量label中返回。C = min(A,[],dim)-返回A中由dim指定的维数范围中的最小值,dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最小值。label的取值在1-k之间
    for i = 1:k
       C(i, :) = mean(X(label == i , :)); %取新的k个聚类中心;label=1(2、3)的所有行,求每列的均值;
    end
    J_cur = sum(sum((X - C(label, :)).^2, 2));%距离之和;X - C(label, :)-对应行相减
    J = [J, J_cur];
    display(sprintf('#迭代次数: %03d, 目标函数: %f', iter, J_cur));%sprintf-将数据格式化为字符串或字符向量;%03d-左边补0 的等宽格式,比如数字12,%03d出来就是:012;sprintf() = display(sprintf());

    if  norm(J_cur-J_prev, 'fro') < tol%n=norm(A,p)-A和A'的积的对角线和的平方根,即sqrt(sum(diag(A'*A))),本次与上次距离之差
        break
    end
    if (iter==10),% A和A'的积的对角线和的平方根,即sqrt(sum(diag(A'*A))),本次与上次距离之差
        break
    end
    J_prev = J_cur;
end


kmeanstext

I = imread('../1.jpeg');
[m, n, p] = size(I);
figure
subplot(1,2,1);imshow(I);title('原始图像');%显示图片I

k = 2;%聚类数量
[C, label2, J2] = kmeans(I, k);
I_seg2 = reshape(C(label2, :), m, n, p);%转换成图片矩阵的格式
k = 4;
[C, label3, J3] = kmeans(I, k);
I_seg3 = reshape(C(label3, :), m, n, p);
k = 8;
[C, label4, J4] = kmeans(I, k);
I_seg4 = reshape(C(label4, :), m, n, p);
k = 16;
[C, label5, J5] = kmeans(I, k);
I_seg5 = reshape(C(label5, :), m, n, p);
figure
subplot(2, 4, 1); imshow(uint8(I_seg2), []); title('2-聚类');%imshow(I,[min(I(:)) max(I(:))]);uint8的范围是0-255。
subplot(2, 4, 2); imshow(uint8(I_seg3), []); title('4-聚类');
subplot(2, 4, 3); imshow(uint8(I_seg4), []); title('8-聚类');
subplot(2, 4, 4); imshow(uint8(I_seg5), []); title('16-聚类');

七、神经网络

import torch

import numpy as np

from torch import nn, optim

from torch.autograd import Variable

from torch.utils.data import DataLoader

from torchvision import datasets, transforms

import matplotlib.pyplot as plt

class CNN(nn.Module):

   def __init__(self):

       super(CNN, self).__init__()  

       self.layer1 = nn.Sequential(nn.Conv2d(1, 10, kernel_size=5), nn.BatchNorm2d(10), 

           nn.ReLU(), nn.MaxPool2d(kernel_size=2))

       self.layer2 = nn.Sequential(nn.Conv2d(10, 20, kernel_size=5),nn.BatchNorm2d(20),  

           nn.ReLU(),  nn.MaxPool2d(kernel_size=2))

       self.fc = nn.Sequential( nn.Linear(320, 50),  nn.ReLU(),nn.Linear(50, 10))

   def forward(self, x):  

       x = self.layer1(x)  

       x = self.layer2(x) 

       x = x.view(x.size(0), -1)  

       x = self.fc(x)  

       return x

class BP(nn.Module):

   def __init__(self):

       super(BP, self).__init__()

       self.fc = nn.Sequential(nn.Linear(784, 128),nn.ReLU(inplace=True), nn.Linear(128, 64), nn.ReLU(inplace=True),nn.Linear(64, 10))

   def forward(self, x):

       x = x.view(x.size(0), -1)

       x = self.fc(x)

       return x

def train(model, train_loader, optimizer, criterion, device):

   model.train()

   for batch_idx, (data, target) in enumerate(train_loader):

       data, target = data.to(device), target.to(device)

       optimizer.zero_grad()

       output = model(data)

       loss = criterion(output, target)

       loss.backward()

       optimizer.step()

       if batch_idx % 100 == 0:

           print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(

               epoch, batch_idx * len(data), len(train_loader.dataset),

               100. * batch_idx / len(train_loader), loss.item()))

   return loss.item()

def test(model, test_loader, test_dataset, criterion, device):model.eval()

   test_loss = 0

   correct = 0

   with torch.no_grad():

       for data, target in test_loader:

           data, target = data.to(device), target.to(device)

           output = model(data)

           test_loss += criterion(output, target).item()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【慢SQL性能优化】 一条SQL的生命周期 | 京东物流技术团队

一、 一条简单SQL在MySQL执行过程 一张简单的图说明下&#xff0c;MySQL架构有哪些组件和组建间关系&#xff0c;接下来给大家用SQL语句分析 例如如下SQL语句 SELECT department_id FROM employee WHERE name Lucy AND age > 18 GROUP BY department_id其中name为索引&a…

基于MindAR实现WebAR人脸识别追踪功能

前言 调研 AR SDKValueARKitARKit 是一个移动端 AR 平台&#xff0c;用于在 iOS 上开发增强现实 app&#xff1b;SLAM场景识别、SLAM场景识别、刻度估量、基本边界的垂直和水平面检测、快速稳定的动作捕捉、多重人脸追踪、多人会话、同步前置、后置摄像头ARCoreARCore 是 Goo…

合肥工业大学操作系统实验5

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少…

算法训练 第六周

二、二叉树的中序遍历 本题给我们了一个二叉树&#xff0c;要求我们以中序遍历的方式输出它的值。 1.递归法 使用递归的方式来模拟遍历二叉树的过程&#xff0c;按照左头右的顺序进行&#xff0c;递归终止条件为遇到空节点&#xff0c;具体代码如下&#xff1a; /*** Defini…

电动车码表供电专用降压芯片 电动滑板车降压芯片

中广芯源推出高耐压110V降压IC&#xff0c;封装为SOP8&#xff0c;该芯片可以实现宽电压15-110V输入&#xff0c;最高1A电流输出&#xff0c;并且可以实现开关频率可调&#xff0c;支持12V 1A输出 24V 1A输出&#xff0c;可以广泛的用于电动汽车&#xff0c;电瓶游览车&…

基于Pymavlink协议的BlueROV开发

1 BlueROV概述 1.1 什么是ROV 维基百科遥控潜水器&#xff08;Remotely operated underwater vehicle&#xff0c;缩写ROV&#xff09;是一个无人的水下航行器&#xff0c;以电缆连接到母船的人员操作。常搭载水下光源和照相机、摄影机、机械手臂、声纳等。因为具有机械手臂&a…

小白学爬虫:通过关键词搜索1688商品列表数据接口|1688商品列表数据接口|1688商品列表数据采集|1688API接口

通过关键词搜索1688商品列表数据接口可以使用1688开放平台提供的API接口实现。以下是使用关键词搜索商品列表数据的基本步骤&#xff1a; 1、注册并获取AppKey。 2、构造请求参数&#xff0c;包括搜索关键词、页码、每页条数等。 3、通过API接口链接&#xff0c;将请求参数发送…

react:路由

官方文档&#xff1a;https://reactrouter.com/en/main/start/overview#pending-navigation-ui 一&#xff1a;简单版本 先 npm i react-router-dom main.ts中内容替换为 import ReactDOM from react-dom/client import App from ./App.tsx import ./index.css import {creat…

2023.10.18 信息学日志

1. CF1689D Lena and Matrix 题目描述 n ⋅ m n \cdot m n⋅m 的矩阵&#xff0c;求矩阵上任意一点坐标使得到矩阵上的关键点曼哈顿距离最大值最小。数据范围&#xff1a; ∑ n ⋅ m ≤ 1 0 6 \sum n \cdot m \leq 10^6 ∑n⋅m≤106 题目概况 来源&#xff1a;Codeforces …

【广州华锐互动】气象卫星监测AR互动教学软件为气象学习带来更多乐趣

由VR制作公司广州华锐互动开发的气象卫星监测AR互动教学软件是一款结合了增强现实(AR)技术与气象监测技术的教育软件。它通过直观、互动的方式&#xff0c;帮助学生更好地理解和掌握气象监测的基本知识和技能。本文将从气象卫星监测AR互动教学软件的应用场景、优势分析、实际意…

【SVN】

SVN 1 svn使用1.1 主干合并到分支1.2 分支合并到主干1.3 分支建立1.4 创建分支1.5 切换分支1.6 合并分支1.7 删除分支 2 概念理解 1 svn使用 1.1 主干合并到分支 首先&#xff0c;在本地trunk中先update一下&#xff0c;有冲突的解决冲突&#xff0c;保证trunk和repository已…

初步了解 RabbitMQ

目录 ​编辑一、MQ 概述 1、MQ 的简介 2、MQ 的用途 &#xff08;1&#xff09;限流削峰 &#xff08;2&#xff09;异步解耦 (3)数据收集 二、RabbitMQ 概述 1、RabbitMQ 简介 2、四大核心概念 3、RabbitMQ 的核心部分 ​编辑 4、名词解释&#xff1a; 三、Hello …

用C++编写动画+音频版极乐净土

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<graphics.h> #include<Windows.h> #include<MMSystem.h>//播放音乐所需要的头文件 #pragma comment(lib,"winmm.lib")//告诉编译器&#xff0c;加载winmm.lib库文件 #define C…

[黑马程序员Pandas教程]——Pandas缺失值处理

目录&#xff1a; 学习目标空值和缺失值查看缺失值 加载数据并通过info函数初步查看缺失值情况df.isnull().sum()空值数量统计Missingno库对缺失值的情况进行可视化探查 安装missingno库missingno.bar(df)缺失值数量可视化missingno.matrix(df)缺失值位置的可视化missingno.he…

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图&#xff1a; Sapera Configuration 缓存与内存管理&#xff0c;以及通信端口配置工具&#xff0c;部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…

搭建的maven仓库如何在本地配置maven下载仓库以及仓库下载优先级

打开maven的settings.xml文件首先可配置maven的本地仓库路径 <localRepository>D:\java\apache-maven-3.6.3\resourceRoot</localRepository> 配置自己搭建的maven的服务名以及账号密码 <server><id>xxxxServer</id><username>xxxx</us…

15套前端经典实战项目大合集,小白练手必备实战项目

15套前端经典实战项目大合集&#xff0c;悄悄练习&#xff0c;你会惊艳所有人。 今日我以内卷为荣&#xff0c;明日内卷以我为荣&#xff0c;不管学习哪门语言都要做出实际的东西来&#xff0c;这个实际的东西就是项目。 这里整理了15前端经典实战项目&#xff0c;每套都有完…

Redis 扩展 RedisBloom 插件,解决缓存击穿、穿透

文章目录 一、概述二、编译准备2.1 升级 make2.2 安装 Python3 三、编译 RedisBloom四、测试 RedisBloom五、应用场景5.1 缓存击穿5.2 缓存穿透5.3 原理总结 六、存在的问题 如果您对Redis的了解不够深入请关注本栏目&#xff0c;本栏目包括Redis安装&#xff0c;Redis配置文件…

使用CMake引入第三方so库及头文件并调用头文件声明的函数

首先,要调用别人的so库和头文件,我们自己项目中需要有NDK。 因为只有C++代码才能直接调用C++代码,也就是头文件和so库的函数。 其次,就是要想办法把头文件,so库和项目中的NDK关联起来,然后作为一个整体,生成一个jni,供Java层调用。 最后,二者的关联是通过CMake完成的…

软件测试/测试开发丨接口测试Mock实战练习学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27857 一、Rewrite 1.1、Rewrite 原理 1.2、Rewrite 实战 Tools → Rewrite 勾选 Enable Rewrite 点击下方 Add 按钮新建一个重写的规则 在右侧编辑重…