matlab_图像分割算法源码要点
部分图像分割的方法(matlab)

部分图像分割的方法(matlab)大津法:function y1=OTSU(image,th_set)image=imread('color1.bmp');gray=rgb2gray(image);%原图像的灰度图low_high=stretchlim(gray);%增强图像,似乎也不是一定需要gray=imadjust(gray,low_high,[]);% subplot(224);imshow(gray);title('after adjust');count=imhist(gray);[r,t]=size(gray);n=r*t;l=256;count=count/n;%各级灰度出现的概率for i=2:lif count(i)~=0st=i-1;breakendend%以上循环语句实现寻找出现概率不为0的最小灰度值for i=l:-1:1if count(i)~=0;nd=i-1;breakendend%实现找出出现概率不为0的最大灰度值f=count(st+1:nd+1);p=st;q=nd-st;%p和分别是灰度的起始和结束值u=0;for i=1:q;u=u+f(i)*(p+i-1);ua(i)=u;end程序二:clc; clear;cd 'D:\My Documents\MATLAB' time = now;I = imread('qr4.bmp');figure(1),imshow(I),title('p1_1.bmp'); % show the pictureI2 = rgb2gray(I);figure(2),imshow(I2),title('I2.bmp'); %ÖÐÖµÂ˲¨J = medfilt2(I2); figure(3),imshow(J);imwrite(J,'J.bmp'); [M N] = size(J);J1 = J(1:M/2,1:fix(N/2)); J2 = J(1:M/2,fix(N/2)+1:N); J3 = J(M/2+1:M, 1:fix( N/2)); J4 = J(M/2+1:M, fix(N/2)+1:N); % figure(4), img = J1;T1 = test_gray2bw( img ); % figure(5), img = J2;T2 = test_gray2bw( img ); % figure(6), img = J3;T3 = test_gray2bw( img ); % figure(7), img = J4;T4 = test_gray2bw( img ); T = [T1,T2;T3,T4]; figure,imshow(T)% T1 = edge(T,'sobel'); % figure,imshow(T1); % BW = edge(T,'sobel'); % f igure,imshow(BW);function [bw_img] = test_gray2bw( img ) %大津法[row_img col_img ] = size( img ) all_pix = row_img * col_img% get probability of each pixel(ÏñËØ). count_pix = zeros(1,256) % pro_pix = []for i = 1 : 1 : row_img for j = 1 : 1 : col_imgcount_pix(1,img(i,j)+1) = count_pix(1,img(i,j)+1) + 1 %ͳ¼Æ´ÎÊý end en dpro_pix = count_pix / all_pix% choose k value; max_kesi = -1 T = 0for k = 1 : 1 :while( i <= k )wa = wa + pro_pix(1,i+1) %ǰk¸öi£¬Ã¿¸öÏñËØµÄ»Ò¶È¸ÅÂÊ£¬¸ÅÂÊºÍ ua = ua + i * pro_pix(1,i+1) i = i + 1 endif ( wa == 0.0 ) continue; elseua = ua / wa endub = 0 wb = 0 i = k + 1while( i <= 255 )wb = wb + pro_pix( 1 , i + 1 )ub = ub + i * pro_pix( 1 , i + 1 ) i = i + 1 endif ( wb == 0.0 ) continue; elseub = ub / wb endu = wa * ua + wb * ub% kesi = wa * ( ua - u ) * ( ua - u ) + wb * ( ub - u ) * ( ub -u ) % %ÉÏÏÂÕâÁ½¸ö¹«Ê½Êǵȼ۵Äkesi = wa * wb * (ua - ub)^2; if( kesi > max_kesi ) max_kesi = kesi T = k end end% get bw img bw_img = imgfor i = 1 : 1 : row_img for j = 1 : 1 : col_img if ( img(i,j) <= T ) bw_img(i,j) = 0elsebw_img( i,j ) = 255 end end endimwrite(bw_img,'bw_img.bmp')figure(),imshow('bw_img.bmp')%,title('bw_ing')区域生长法:close all;clear all;clc;A=dicomread('im.dcm');%读入图像(医学CT图像)% seed=[200,220];%选择起始位置thresh=6.3;%相似性选择阈值%A=rgb2gray(A0);%A=A0;%灰度化%A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]); figure,imshow(A,[]);A=double(A); %将图像灰度化[y,x]=getpts; %获得区域生长起始点x1=round(x); %横坐标取整y1=round(y); %纵坐标取整seed=A(x1,y1);B=A;%将A赋予B[r,c]=size(B);%图像尺寸r为行数,c为列数n=r*c;%计算图像所包含点的个数pixel_seed=seed;%原图起始点灰度值q=[x1 y1];%q用来装载起始位置top=1;%循环判断flagM=zeros(r,c);%建立一个与原图形同等大小的矩阵M(x1,y1)=1;%将起始点赋为1,其余为0count=1;%计数器while top~=0%也可以写成top!=0 循环结束条件r1=q(1,1);%起始点行位置c1=q(1,2);%起始点列位置p=A(r1,c1);%起始点灰度值dge=0;for i=-1:1%周围点的循环判断for j=-1:1if r1+i<=r&r1+i>0&c1+j<=c&c1+j>0%保证在点周围范围之内if abs(A(r1+i,c1+j)-p)<=thresh&M(r1+i,c1+j)~=1%判定条件?top=top+1;%满足判定条件top加1,top为多少,则q的行数有多少行q(top,:)=[r1+i c1+j];%将满足判定条件的周围点的位置赋予q,q记载了满足判定的每一外点M(r1+i,c1+j)=1;%满足判定条件将M中相对应的点赋为1count=count+1;%统计满足判定条件的点个数,其实与top此时的值一样B(r1+i,c1+j)=1;%满足判定条件将B中相对应的点赋为1endif M(r1+i,c1+j)==0;%如果M中相对应点的值为0将dge赋为1,也是说这几个点不满足条件dge=1;%将dge赋为1endelsedge=1;%点在图像外将dge赋为1endendend%此时对周围几点判断完毕,在点在图像外或不满足判定条件则将dge赋为1,满足条件dge为0if dge~=1%最后判断的周围点(i=1,j=1)是否满足条件,如dge=0,满足。
基于Matlab的彩色图像分割

3 Matlab编程实现3.1 Matlab编程过程用Matlab来分割彩色图像的过程如下:1)获取图像的RGB颜色信息。
通过与用户的交互操作来提示用户输入待处理的彩色图像文件路径;2)RGB彩色空间到lab彩色空间的转换。
通过函数makecform()和applycform()来实现; 3)对ab分量进行Kmean聚类。
调用函数kmeans()来实现;4)显示分割后的各个区域。
用三副图像分别来显示各个分割目标,背景用黑色表示。
3.2 Matlab程序源码%文件读取clear;clc;file_name = input('请输入图像文件路径:','s');I_rgb = imread(file_name); %读取文件数据figure();imshow(I_rgb); %显示原图title('原始图像');%将彩色图像从RGB转化到lab彩色空间C = makecform('srgb2lab'); %设置转换格式I_lab = applycform(I_rgb, C);%进行K-mean聚类将图像分割成3个区域ab = double(I_lab(:,:,2:3)); %取出lab空间的a分量和b分量nrows = size(ab,1);ncols = size(ab,2);ab = reshape(ab,nrows*ncols,2);nColors = 3; %分割的区域个数为3[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean','Replicates',3); %重复聚类3次pixel_labels = reshape(cluster_idx,nrows,ncols);figure();imshow(pixel_labels,[]), title('聚类结果');%显示分割后的各个区域segmented_images = cell(1,3);rgb_label = repmat(pixel_labels,[1 1 3]);for k = 1:nColorscolor = I_rgb;color(rgb_label ~= k) = 0;segmented_images{k} = color;endfigure(),imshow(segmented_images{1}), title('分割结果——区域1'); figure(),imshow(segmented_images{2}), title('分割结果——区域2'); figure(),imshow(segmented_images{3}), title('分割结果——区域3');。
数字图像灰度阈值的图像分割技术matlab要点

数字图像灰度阈值的图像分割技术matlab要点介绍图像分割是一种将数字图像分割成多个子图像或区域的方法。
其中,数字图像灰度阈值分割技术是一种常用的图像分割技术,它的基本思想是将图像中的像素根据其灰度值与事先确定的阈值进行分类。
MATLAB是一个强大的数学分析工具和编程语言,在数字图像处理领域也有着广泛的应用。
本文将详细介绍数字图像灰度阈值的图像分割技术在MATLAB中的要点,帮助读者将这一技术应用于实际项目中。
原理灰度阈值分割技术是基于图像中像素的灰度值进行分类的。
假设一幅灰度图像的灰度值范围为0到255,若用一把长度为1的量尺沿着这个灰度范围进行扫描,相当于将灰度范围分成了256个间隔。
当沿着量尺进行扫描时,可以观察到大量像素的灰度值集中在某个区域内,这就是该区域像素的灰度分布。
将灰度图像中的像素根据其灰度值与事先确定的阈值进行分类,将像素分成两个集合:高于阈值的像素集合和低于阈值的像素集合。
这就是二值图像了。
当然,如果阈值的确定不理想,那么图像的分割效果也不会很理想。
实现在MATLAB中实现数字图像灰度阈值的图像分割技术,需要分为以下几个步骤:1. 导入图像使用MATLAB的imread函数可以导入待处理的图像。
例如:I = imread('test.jpg');2. 灰度化处理在将图像进行阈值分割之前,需要将图像进行灰度化处理,保留图像中像素的灰度信息。
灰度化处理可以使用MATLAB的rgb2gray函数。
例如:I_gray = rgb2gray(I);3. 初步确定阈值通过直观的观察或使用MATLAB的imhist函数,可以初步确定图像的灰度阈值(threshold)。
例如:imhist(I_gray);threshold = 128;4. 阈值分割利用初步确定的阈值进行阈值分割,将图像分成两个集合:高于阈值的像素集合和低于阈值的像素集合。
MATLAB中可以使用im2bw函数实现二值化操作。
Matlab中的自然图像分割与图像提取技术详解

Matlab中的自然图像分割与图像提取技术详解自然图像分割和图像提取是数字图像处理中的重要技术之一,它可以从复杂的自然图像中提取出感兴趣的目标或者区域,为后续的图像处理和分析提供有力的支持和基础。
在本文中,我们将详细介绍在Matlab中实现自然图像分割和图像提取的方法和技巧。
一、图像预处理在进行图像分割和提取之前,需要对原始图像进行一系列预处理操作。
首先,我们需要载入图像并将其转换为灰度图像。
可以通过Matlab中的imread函数读取图像,然后利用rgb2gray函数将图像转换为灰度图像。
接着,我们可以对图像进行平滑处理,以去除噪声。
Matlab中提供了多种平滑滤波器,如高斯滤波、中值滤波等,可以根据具体情况选择适合的滤波器。
二、阈值分割阈值分割是最常用的一种图像分割方法,它通过将图像中的像素根据其灰度值与预设的阈值进行比较,将其分为不同的区域或者目标。
在Matlab中,可以利用函数imbinarize实现简单的阈值分割。
该函数可以根据用户设定的阈值将灰度图像二值化,生成二值图像。
用户可以通过调整阈值的大小,从而获得不同的分割效果。
三、基于边缘的分割基于边缘的分割方法是另一种常用的图像分割技术,它通过检测图像中的边缘信息来实现分割。
在Matlab中,可以利用一系列边缘检测算法来提取图像中的边缘信息,如Sobel算子、Canny算子等。
这些算法可以对图像进行梯度计算,然后根据梯度的变化来检测边缘。
通过对边缘进行二值化和分割,可以得到图像中的目标或者区域。
四、区域生长算法区域生长算法是一种基于像素相似性的图像提取技术,它通过选择合适的种子点和生长准则,将与种子点相似的像素逐步加入到同一区域中,从而实现图像提取。
在Matlab中,可以利用regiongrowing函数实现简单的区域生长算法。
该函数需要用户提供种子点的坐标和生长准则,可以得到图像中与种子点相似的区域。
五、基于聚类的图像分割聚类是一种常用的无监督学习方法,它的目标是将数据集划分为若干个子集,其中子集内的数据点相似度较高,而子集之间的相似度较低。
部分图像分割的方法(matlab)

大津法:function y1=OTSU(image,th_set)image=imread('color1.bmp');gray=rgb2gray(image);%原图像的灰度图low_high=stretchlim(gray);%增强图像,似乎也不是一定需要gray=imadjust(gray,low_high,[]);% subplot(224);imshow(gray);title('after adjust');count=imhist(gray);[r,t]=size(gray);n=r*t;l=256;count=count/n;%各级灰度出现的概率for i=2:lif count(i)~=0st=i-1;breakendend%以上循环语句实现寻找出现概率不为0的最小灰度值for i=l:-1:1if count(i)~=0;nd=i-1;breakendend%实现找出出现概率不为0的最大灰度值f=count(st+1:nd+1);p=st;q=nd-st;%p和分别是灰度的起始和结束值u=0;for i=1:q;u=u+f(i)*(p+i-1);ua(i)=u;end%计算图像的平均灰度值for i=1:q;w(i)=sum(f(1:i));end%计算出选择不同k的时候,A区域的概率d=(u*w-ua).^2./(w.*(1-w));%求出不同k值时类间方差[y,tp]=max(d);%求出最大方差对应的灰度级th=tp+p;if th<th_setth=tp+p;elseth=th_set; %根据具体情况适当修正门限endy1=zeros(r,t);for i=1:rfor j=1:tx1(i,j)=double(gray(i,j));endendfor i=1:rfor j=1:tif (x1(i,j)>th)y1(i,j)=x1(i,j);elsey1(i,j)=0;endendend%上面一段代码实现分割% figure,imshow(y1);% title('灰度门限分割的图像');程序二:clc; clear;cd 'D:\My Documents\MATLAB' time = now;I = imread('qr4.bmp');figure(1),imshow(I),title('p1_1.bmp'); % show the pictureI2 = rgb2gray(I);figure(2),imshow(I2),title('I2.bmp'); %ÖÐÖµÂ˲¨J = medfilt2(I2); figure(3),imshow(J);imwrite(J,'J.bmp'); [M N] = size(J);J1 = J(1:M/2,1:fix(N/2)); J2 = J(1:M/2,fix(N/2)+1:N); J3 = J(M/2+1:M, 1:fix( N/2)); J4 = J(M/2+1:M, fix(N/2)+1:N); % figure(4), img = J1;T1 = test_gray2bw( img ); % figure(5), img = J2;T2 = test_gray2bw( img ); % figure(6), img = J3;T3 = test_gray2bw( img ); % figure(7), img = J4;T4 = test_gray2bw( img ); T = [T1,T2;T3,T4]; figure,imshow(T)% T1 = edge(T,'sobel'); % figure,imshow(T1); % BW = edge(T,'sobel'); % f igure,imshow(BW);function [bw_img] = test_gray2bw( img ) %大津法[row_img col_img ] = size( img ) all_pix = row_img * col_img% get probability of each pixel(ÏñËØ). count_pix = zeros(1,256) % pro_pix = []for i = 1 : 1 : row_img for j = 1 : 1 : col_imgcount_pix(1,img(i,j)+1) = count_pix(1,img(i,j)+1) + 1 %ͳ¼Æ´ÎÊý end en dpro_pix = count_pix / all_pix% choose k value; max_kesi = -1 T = 0for k = 1 : 1 :while( i <= k )wa = wa + pro_pix(1,i+1) %ǰk¸öi£¬Ã¿¸öÏñËØµÄ»Ò¶È¸ÅÂÊ£¬¸ÅÂÊºÍ ua = ua + i * pro_pix(1,i+1) i = i + 1 endif ( wa == 0.0 ) continue; elseua = ua / wa endub = 0 wb = 0 i = k + 1while( i <= 255 )wb = wb + pro_pix( 1 , i + 1 )ub = ub + i * pro_pix( 1 , i + 1 ) i = i + 1 endif ( wb == 0.0 ) continue; elseub = ub / wb endu = wa * ua + wb * ub% kesi = wa * ( ua - u ) * ( ua - u ) + wb * ( ub - u ) * ( ub -u ) % %ÉÏÏÂÕâÁ½¸ö¹«Ê½Êǵȼ۵Äkesi = wa * wb * (ua - ub)^2; if( kesi > max_kesi ) max_kesi = kesi T = k end end% get bw img bw_img = imgfor i = 1 : 1 : row_img for j = 1 : 1 : col_img if ( img(i,j) <= T ) bw_img(i,j) = 0elsebw_img( i,j ) = 255 end end endimwrite(bw_img,'bw_img.bmp')figure(),imshow('bw_img.bmp')%,title('bw_ing')区域生长法:close all;clear all;clc;A=dicomread('im.dcm');%读入图像(医学CT图像)% seed=[200,220];%选择起始位置thresh=6.3;%相似性选择阈值%A=rgb2gray(A0);%A=A0;%灰度化%A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]); figure,imshow(A,[]);A=double(A); %将图像灰度化[y,x]=getpts; %获得区域生长起始点x1=round(x); %横坐标取整y1=round(y); %纵坐标取整seed=A(x1,y1);B=A;%将A赋予B[r,c]=size(B);%图像尺寸r为行数,c为列数n=r*c;%计算图像所包含点的个数pixel_seed=seed;%原图起始点灰度值q=[x1 y1];%q用来装载起始位置top=1;%循环判断flagM=zeros(r,c);%建立一个与原图形同等大小的矩阵M(x1,y1)=1;%将起始点赋为1,其余为0count=1;%计数器while top~=0%也可以写成top!=0 循环结束条件r1=q(1,1);%起始点行位置c1=q(1,2);%起始点列位置p=A(r1,c1);%起始点灰度值dge=0;for i=-1:1%周围点的循环判断for j=-1:1if r1+i<=r&r1+i>0&c1+j<=c&c1+j>0%保证在点周围范围之内if abs(A(r1+i,c1+j)-p)<=thresh&M(r1+i,c1+j)~=1%判定条件?top=top+1;%满足判定条件top加1,top为多少,则q的行数有多少行q(top,:)=[r1+i c1+j];%将满足判定条件的周围点的位置赋予q,q记载了满足判定的每一外点M(r1+i,c1+j)=1;%满足判定条件将M中相对应的点赋为1count=count+1;%统计满足判定条件的点个数,其实与top此时的值一样B(r1+i,c1+j)=1;%满足判定条件将B中相对应的点赋为1endif M(r1+i,c1+j)==0;%如果M中相对应点的值为0将dge赋为1,也是说这几个点不满足条件dge=1;%将dge赋为1endelsedge=1;%点在图像外将dge赋为1endendend%此时对周围几点判断完毕,在点在图像外或不满足判定条件则将dge赋为1,满足条件dge为0if dge~=1%最后判断的周围点(i=1,j=1)是否满足条件,如dge=0,满足。
图像分割技术的matlab实现

f=rgb2gray(f); % 将彩色图像转换为灰度图像f=im2double(f); % 转换为双精度,便于后面的计算figure, imshow(f),title('Original Image'),PF=edge(f,'prewitt'); % 边缘探测,算子为prewitt figure,imshow(PF),title('Prewitt Filter');RF=edge(f,'roberts'); % 边缘探测,算子为roberts figure,imshow(RF),title('Roberts Filter');LF=edge(f,'log'); % 边缘探测,算子为logfigure,imshow(LF),title('Laplacian of Gaussian (LoG) Filter');CF=edge(f,'canny'); % 边缘探测,算子为canny figure,imshow(CF),title('Canny Filter');f=rgb2gray(f); % 灰度转换f=im2double(f); % 数据类型转换% 使用垂直Sobel算子,自动选择阈值[VSFAT Threshold]=edge(f,'sobel','vertical'); % 边缘探测figure, imshow(f),title('Original Image'), % 显示原始图像figure,imshow(VSFAT),title('Sobel Filter - Automatic Threshold'); % 显示边缘探测图像%使用水平和垂直Sobel算子,自动选择阈值SFST=edge(f,'sobel',Threshold);figure,imshow(SFST),title('Sobel Filter (Horizontal and Vertical)'); % 显示边缘探测图像%使用指定45度角Sobel算子滤波器,指定阈值s45=[-2 -1 0;-1 0 1;0 1 2];SFST45=imfilter(f,s45,'replicate');SFST45=SFST45>=Threshold;figure,imshow(SFST45),title('Sobel Filter (45 Degree)'); % 显示边缘探测图像%使用指定-45度角Sobel算子滤波器,指定阈值sm45=[0 1 2;-1 0 1;-2 -1 0];SFSTM45=imfilter(f,sm45,'replicate');SFSTM45=SFSTM45>=Threshold;figure,imshow(SFSTM45),title('Sobel Filter (-45 Degree)'); % 显示边缘探测图像I = imread('circuit.tif');rotI = imrotate(I,33,'crop'); % 图像旋转,该函数具体用法在本书13.3.3有介绍。
Matlab程序遗传算法大津法区域生长法迭代法分割图像
Matlab程序:遗传算法/大津法/区域生长法/迭代法分割图像区域生长的图像分割程序image=imread('mri1.bmp');I=rgb2gray(image);figure,imshow(I),title('原始图像')I=double(I);[M,N]=size(I);[y,x]=getpts; %获得区域生长起始点x1=round(x); %横坐标取整y1=round(y); %纵坐标取整seed=I(x1,y1); %将生长起始点灰度值存入seed中Y=zeros(M,N); %作一个全零与原图像等大的图像矩阵Y,作为输出图像矩阵Y(x1,y1)=1; %将Y中与所取点相对应位置的点设置为白场sum=seed; %储存符合区域生长条件的点的灰度值的和suit=1; %储存符合区域生长条件的点的个数count=1; %记录每次判断一点周围八点符合条件的新点的数目threshold=15; %域值while count>0s=0; %记录判断一点周围八点时,符合条件的新点的灰度值之和count=0;for i=1:Mfor j=1:Nif Y(i,j)==1if (i-1)>0 && (i+1)<(M+1) && (j-1)>0 && (j+1)<(N+1) %判断此点是否为图像边界上的点for u= -1:1 %判断点周围八点是否符合域值条件for v= -1:1 %u,v为偏移量if Y(i+u,j+v)==0 & abs(I(i+u,j+v)-seed)<=threshold& 1/(1+1/15*abs(I(i+u,j+v)-seed))>0.8%判断是否未存在于输出矩阵Y,并且为符合域值条件的点Y(i+u,j+v)=1; %符合以上两条件即将其在Y中与之位置对应的点设置为白场count=count+1;s=s+I(i+u,j+v); %此点的灰度之加入s中endendendendendendendsuit=suit+count; %将n 加入符合点数计数器中sum=sum+s; %将s加入符合点的灰度值总合中seed=sum/suit; %计算新的灰度平均值endfigure,imshow(Y),title('分割后图像')。
基于MATLAB的图像分块方法
基于MATLAB的图像分块方法lyqmath0 引言通常我们对图像要求按指定块数或者指定长宽来做图像规则分块。
这就要求对图像的长宽信息按指定方式做处理。
这里给出按照规则分割方法得到的分割结果。
参数要求为分块的个数或者图像块的大小信息。
1 区域分割输入图像,要求分割成X*Y的图像块,然后做出矩形框标记。
代码clc; clear all; close all;I = imread('c:\\ceshi.jpg');rs = size(I, 1); % 行数cs = size(I, 2); % 列数% ch为列间隔 cw为行间隔% numr为间隔块个数 numc为间隔块个数ch = 41;cw = 40;numr = round(rs/ch);numc = round(cs/cw);% 区域块分割t1 = (0:numr-1)*ch + 1; t2 = (1:numr)*ch;t3 = (0:numc-1)*cw + 1; t4 = (1:numc)*cw;figure; imshow(I); hold on;for i = 1 : numrfor j = 1 : numcx = t1(i):t2(i);y = t3(j):t4(j);% 绘制矩形块rectangle('Position', [t3(j) t1(i) length(x) length(y)], ...'EdgeColor', 'r', 'LineWidth', 3);endend结果2 结论根据输入参数做图像分块处理,注意到图像矩阵的行列特性,可以做进一步提取。
欢迎访问我的博客:/lyqmath。
数字图像灰度阈值的图像分割技术matlab要点
1.课程设计的目的(1)使学生通过实验体会一些主要的分割算子对图像处理的效果,以及各种因素对分割效果的影响(2)使用Matlab软件进行图像的分割(3)能够进行自行评价各主要算子在无噪声条件下和噪声条件下的分割性能(4)能够掌握分割条件(阈值等)的选择(5)完成规定图像的处理并要求正确评价处理结果,能够从理论上做出合理的解释2.课程设计的要求(1)能对图像文件(bmp,jpg,tiff,gif)进行打开,保存,退出等功能操作(2)包含功能模块:图像的边缘检测(使用不同梯度算子和拉普拉斯算子) (3)封闭轮廓边界(4)区域分割算法:阈值分割,区域生长等3.前言3.1图像阈值分割技术基本原理所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内,表现出一致性或相似性,而在不同区域间表现出明显的不同。
简单的讲,就是在一幅图像中,把目标从背景中分离出来,以便于进一步处理。
图像分割是图像处理与计算机视觉领域低层次视觉中最为基础和重要的领域之一,它是对图像进行视觉分析和模式识别的基本前提。
同时它也是一个经典难题,到目前为止既不存在一种通用的图像分割方法,也不存在一种判断是否分割成功的客观标准]5[。
在对图像的研究和应用中,人们往往仅对图像中的某些部分感兴趣,这些部分称为目标或前景(其他部分称为背景),他们一般对应图像中特定的、具有独特性质的区域。
为了辨识和分析目标,需要将他们分离提取出来,在此基础上才有可能对目标进一步利用。
图像分割就是指把图像分成格局特性的区域并提取出感兴趣目标的技术和过程。
这里特性可以是象素的灰度、颜色、纹理等,预先定义的目标可以对应单个区域,也可以对应多个区域。
现有的图像分割算法有:阈值分割、边缘检测和区域提取法。
本文着重研究基于阈值法的图像分割技术。
若图像中目标和背景具有不同的灰度集合:目标灰度集合与背景灰度集合,且两个灰度集合可用一个灰度级阈值T进行分割。
matlab二值化分割代码
matlab二值化分割代码
以下是一个简单的 MATLAB 代码示例,用于对图像进行二值化分割:
matlab.
% 读取图像。
img = imread('your_image.jpg');
% 将图像转换为灰度图像。
gray_img = rgb2gray(img);
% 使用Otsu方法进行图像二值化。
level = graythresh(gray_img);
bw_img = imbinarize(gray_img,level);
% 显示原始图像和二值化图像。
subplot(1,2,1), imshow(gray_img), title('Original Image');
subplot(1,2,2), imshow(bw_img), title('Binary Image');
在这个示例中,首先使用 `imread` 函数读取图像,然后使用`rgb2gray` 函数将图像转换为灰度图像。
接下来,使用
`graythresh` 函数确定阈值,并使用 `imbinarize` 函数将灰度图像转换为二值化图像。
最后,使用 `subplot` 和 `imshow` 函数显示原始图像和二值化图像。
需要注意的是,这只是一个简单的二值化分割示例。
实际应用中可能需要根据具体的图像特征和要求进行参数调整和算法优化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
matlab 图像分割算法源码图像读取及灰度变换I=imread('cameraman.tif');%读取图像subplot(1,2,1),imshow(I) %输出图像title('原始图像') %在原始图像中加标题subplot(1,2,2),imhist(I) %输出原图直方图title('原始图像直方图') %在原图直方图上加标题图像旋转I = imread('cameraman.tif');figure,imshow(I);theta = 30;K = imrotate(I,theta); % Try varying the angle, theta. figure, imshow(K)边缘检测I = imread('cameraman.tif');J1=edge(I,'sobel');J2=edge(I,'prewitt');J3=edge(I,'log');subplot(1,4,1),imshow(I);subplot(1,4,2),imshow(J1);subplot(1,4,3),imshow(J2);subplot(1,4,4),imshow(J3);1.图像反转MATLAB程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8(J);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(H);2.灰度线性变换MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1] subplot(2,2,3),imshow(J);title('线性变换图像[0.1 0.5]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1] subplot(2,2,4),imshow(K);title('线性变换图像[0.3 0.7]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系3.非线性变换MATLAB程序实现如下:I=imread('xian.bmp');I1=rgb2gray(I);subplot(1,2,1),imshow(I1);title('灰度图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系J=double(I1);J=40*(log(J+1));H=uint8(J);subplot(1,2,2),imshow(H);title('对数变换图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系4.直方图均衡化MATLAB程序实现如下:I=imread('xian.bmp');I=rgb2gray(I);figure;subplot(2,2,1);imshow(I);subplot(2,2,2);imhist(I);I1=histeq(I);figure;subplot(2,2,1);imshow(I1);subplot(2,2,2);imhist(I1);5.线性平滑滤波器用MATLAB实现领域平均法抑制噪声程序:I=imread('xian.bmp');subplot(231)imshow(I)title('原始图像')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);subplot(232)imshow(I1)title('添加椒盐噪声的图像')k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波subplot(233),imshow(k1);title('3*3模板平滑滤波');subplot(234),imshow(k2);title('5*5模板平滑滤波');subplot(235),imshow(k3);title('7*7模板平滑滤波');subplot(236),imshow(k4);title('9*9模板平滑滤波');6.中值滤波器用MATLAB实现中值滤波程序如下:I=imread('xian.bmp');I=rgb2gray(I);J=imnoise(I,'salt&pepper',0.02);subplot(231),imshow(I);title('原图像');subplot(232),imshow(J);title('添加椒盐噪声图像'); k1=medfilt2(J); %进行3*3模板中值滤波k2=medfilt2(J,[5,5]); %进行5*5模板中值滤波k3=medfilt2(J,[7,7]); %进行7*7模板中值滤波k4=medfilt2(J,[9,9]); %进行9*9模板中值滤波subplot(233),imshow(k1);title('3*3模板中值滤波'); subplot(234),imshow(k2);title('5*5模板中值滤波'); subplot(235),imshow(k3);title('7*7模板中值滤波'); subplot(236),imshow(k4);title('9*9模板中值滤波');7.用Sobel算子和拉普拉斯对图像锐化:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系H=fspecial('sobel'); %选择sobel算子J=filter2(H,I1); %卷积运算subplot(2,2,3),imshow(J);title('sobel算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子J1=conv2(I1,h,'same'); %卷积运算subplot(2,2,4),imshow(J1);title('拉普拉斯算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系8.梯度算子检测边缘用MATLAB实现如下:I=imread('xian.bmp');subplot(2,3,1);imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,3,2);imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=edge(I1,'roberts');figure;subplot(2,3,3);imshow(I2);title('roberts算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=edge(I1,'sobel');subplot(2,3,4);imshow(I3);title('sobel算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I4=edge(I1,'Prewitt');subplot(2,3,5);imshow(I4);title('Prewitt算子分割结果'); axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系9.LOG算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像');I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'log');subplot(2,2,3);imshow(I2);title('log算子分割结果');10.Canny算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像')I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'canny');subplot(2,2,3);imshow(I2);title('canny算子分割结果');11.边界跟踪(bwtraceboundary函数)clcclear allI=imread('xian.bmp');figureimshow(I);title('原始图像');I1=rgb2gray(I); %将彩色图像转化灰度图像threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限BW=im2bw(I1, threshold); %将灰度图像转化为二值图像figureimshow(BW);title('二值图像');dim=size(BW);col=round(dim(2)/2)-90; %计算起始点列坐标row=find(BW(:,col),1); %计算起始点行坐标connectivity=8;num_points=180;contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_points);%提取边界figureimshow(I1);hold on;plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2);title('边界跟踪图像');12.Hough变换I= imread('xian.bmp');rotI=rgb2gray(I);subplot(2,2,1);imshow(rotI);title('灰度图像');axis([50,250,50,200]);grid on;axis on;BW=edge(rotI,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([50,250,50,200]);grid on;axis on;[H,T,R]=hough(BW);subplot(2,2,3);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); title('霍夫变换图');xlabel('\theta'),ylabel('\rho');axis on , axis normal, hold on;P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));x=T(P(:,2));y=R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); subplot(2,2,4);,imshow(rotI);title('霍夫变换图像检测');axis([50,250,50,200]);grid on;axis on;hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endendplot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');13.直方图阈值法用MATLAB实现直方图阈值法:I=imread('xian.bmp');I1=rgb2gray(I);figure;subplot(2,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系[m,n]=size(I1); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endsubplot(2,2,2),bar(0:255,GP,'g') %绘制直方图title('灰度直方图')xlabel('灰度值')ylabel('出现概率')I2=im2bw(I,150/255);subplot(2,2,3),imshow(I2);title('阈值150的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=im2bw(I,200/255); %subplot(2,2,4),imshow(I3);title('阈值200的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系14. 自动阈值法:Otsu法用MATLAB实现Otsu算法:clcclear allI=imread('xian.bmp');subplot(1,2,1),imshow(I);title('原始图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系level=graythresh(I); %确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu法阈值分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系15.膨胀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀subplot(1,2,2);imshow(I2);title('膨胀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系16.腐蚀操作MATLAB实现腐蚀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀subplot(1,2,2);imshow(I2);title('腐蚀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系17.开启和闭合操作用MATLAB实现开启和闭合操作I=imread('xian.bmp'); %载入图像subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1); %采用半径为1的圆作为结构元素I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(2,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(2,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系18.开启和闭合组合操作I=imread('xian.bmp'); %载入图像subplot(3,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(3,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(3,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5); %开—闭运算图像title('开—闭运算图像');axis([50,250,50,200]);axis on; %显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7); %闭—开运算图像title('闭—开运算图像');axis([50,250,50,200]);axis on; %显示坐标系19.形态学边界提取利用MATLAB实现如下:I=imread('xian.bmp'); %载入图像subplot(1,3,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(1,3,2),imshow(I1);title('二值化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=bwperim(I1); %获取区域的周长subplot(1,3,3),imshow(I2);title('边界周长的二值图像');axis([50,250,50,200]);grid on;axis on;20.形态学骨架提取利用MATLAB实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on;I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);axis on;I2=bwmorph(I1,'skel',1);subplot(2,2,3),imshow(I2);title('1次骨架提取');axis([50,250,50,200]);axis on;I3=bwmorph(I1,'skel',2);subplot(2,2,4),imshow(I3);title('2次骨架提取');axis([50,250,50,200]);axis on;21.直接提取四个顶点坐标I = imread('xian.bmp');I = I(:,:,1);BW=im2bw(I);figureimshow(~BW)[x,y]=getptsMatlab求二值图像的周长2013-01-21 20:00:21| 分类:matlab | 标签:|字号大中小订阅方法一,使用8向链码。