imfill,matlab怎么实现图像二值化分割

时间:2024-08-27 04:51:19编辑:揭秘君

matlab怎么实现图像二值化分割

用函数im2bw可以实现对灰度图像(或彩色图像的二分处理)。
具体用法如下:BW = im2bw(path, level)。其中,path表示图片的完全路径;level表示区分黑白色的界限(0~1之间的数字)。返回值BW 就是一个只含有01的矩阵。
通常二值化后,用imshow可以看到黑白图片,但实际中还要根据目的做进一步处理,比如较小的全区块0(或者1)为了整体分布的简单会忽略掉。


如何用Matlab对二值图像进行矩形轮廓提取

1 bwperim
根据参考资料[2]的提示,可以使用bwperim()函数进行轮廓提取,具体代码如下:
%读取原图
im = imread( filepath );
imshow(im);
title('原图');
% 转二值图像
bw = im2bw( im );
%轮廓提取
contour = bwperim(bw);
figure
imshow(contour);
title('轮廓')
原图和所提取的轮廓分别如图1和图2所示。
2 edge
可以借助edge()函数进行边界检测,算子可以选择canny,soble等等。具体代码如下:
%读取原图
im = imread( filepath );
imshow(im);
title('原图');
% 转二值图像
bw = im2bw( im );
% 边界检测
contour = edge(bw ,'canny');
figure
imshow(contour);
title('边界')


怎么用opencv获取图像灰度值(用C语言)

1、可以变成灰度图也可以不变。这里假设你的图像都是IPL_DEPTH_8U类型。


2、如果变成灰度图,就是单通道图像,获取的就是每一个像素点的灰度值。
IplImage* img = cvLoadImage("test.bmp", 0);
for (int i = 0; i height; i++)
{
for (int j = 0; j width; j++)
{
//方法一:使用cvGet2D()函数间接访问
CvScalar s = cvGet2D(img, i, j);//其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。
printf("gray value=%f\n",s.val[0]);

//方法二:使用直接访问
uchar val = ((uchar *)(img->imageData + i*img->widthStep))[j];//i和j的意义同上
printf("gray value=%d\n",val);
}
}

3、如果不变成灰度图,就是3通道图像,获取的就是每一个像素点的BGR值,然后分别获取B值,G值和R值。
IplImage* img = cvLoadImage("test.bmp", 1);
for (int i = 0; i height; i++)
{
for (int j = 0; j width; j++)
{
//方法一:使用cvGet2D()函数间接访问
CvScalar s=cvGet2D(img,i,j); //其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);//注意是BGR顺序

//方法二:使用直接访问
int bVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]; // B
int gVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]; // G
int rVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]; // R
printf("B=%d, G=%d, R=%d\n",bVal,gVal,rVal);//注意是BGR顺序
}
}


关于用matlab处理图像的问题,如何将下进行边缘提取,得到比较清晰的轮廓,最好是能寻找到偏心孔的坐标


用MATLAB处理图片除了提到的“灰度(转换)”去除噪声,如果就直接二值化得话,对于一副对比度不大的图片,是不容易清楚地区分的。可以试试灰度拉伸,灰度值均衡化,自适应阈值分割等图像增强的方法。
尺寸测量也就是特征提取,面积可以用扫描法计算区域的像素值,如
sum=0;
for i=30:480
for j=5:505
if j2(i,j)>=0.5 (j2为处理图像)
sum=sum+1;
end如果是计算轮廓长度,用边缘提取的计算再用扫描法计算像素值点。

MATLAB图像处理的算法用到得程序都不难,只要你的图像处理流程试出来的效果好,计算相对都比较简单。


有一首女声英文歌,中间有好几段喔喔喔喔喔,喔喔喔喔喔是什么歌

这首歌叫《heyoh》。以下是歌曲的相关介绍:歌曲带给人们的是全方位的听觉享受,优美的旋律使人能够产生高尚的想法,丰富人类的感情,促进他们理解人类情感的深邃内涵,达到心灵的和谐以及与自然的契合。歌曲是音乐艺术中规模最小、篇幅最短、形成最早和影响最大的音乐艺术形式之一。歌曲从一开始就伴随着人类文明的起源,共同度过了漫长而艰辛的悠悠岁月。歌曲深深地扎根,这种喜闻乐见的艺术表演形式,是人们用来陶冶情操的方式。歌曲的形成,无疑是指音乐和人的声音相结合而来的有声艺术品,由音乐人编曲(把各种乐器的旋律结合在一起),形成的一种人们悦耳可听的旋律,再加上歌词的点缀,人声的结合,从而形成一种人们可以听到的作品,统称为歌曲。以上资料参考百度百科——歌曲

一首哦喔哦喔 哦喔喔的英文歌叫什么歌

《i do 》,《i do 》是美国歌手colbie caillat在2011年演唱并发行的歌曲,收录在其专辑《all of you》中。歌手简介:寇比凯蕾1985年5月28日出生于美国加利福尼亚马里布海滩,美国创作女歌手、演员。2007年,寇比凭借单曲《Bubbly》成名。同年发行了首张专辑《Coco》;2009年1月,寇比和杰森·玛耶兹合作的单曲《Lucky》获得第52届格莱美奖最佳流行合唱大奖,8月25日,寇比发行第二张专辑《Breakthrough》。2010年,寇比入围第52届格莱美音乐奖四项大奖;2011年7月,寇比发行了第三张专辑《All Of You》;2014年9月30日,寇比的第四张专辑《Gypsy Heart》正式发行;2016年10月7日发行独立制作的五张专辑《The Malibu Sessions》。

matlab中图片怎么实现边缘涂黑。。。。

p=imread('000.jpg');subplot(2,1,1);imshow(p);pp=double(p);wd=4; % 涂黑的宽度pp(1:wd,:,:)=0; % 上pp(:,1:wd,:)=0; % 左 pp(end-wd+1:end,:,:)=0; % 下 pp(:,end-wd+1:end,:)=0; % 右pp=uint8(pp);subplot(2,1,2);imshow(pp);

如何用matlab计算二值化图中白色区域的像素点个数

计算原理如下:假设一副二值图片,其背景是黑色的,而边缘是白色的,而且白色边缘中不包含黑色的点,就如附件中的那个图像。程序源码如下:%% step 1clear allclcI=imread('test.bmp');%读入图片bwI=im2bw(I,0.5);%转化为二值图像L=bwlabel(bwI,4);%将四连通区域进行标记[r,c]=find(L==1);%查找其中的白色区域,r是白点的所在行组成的向量,c是白点所在的列组成的向量%% step 2 %去除r中重复的数new_r=[];for i=1:length(r) nn=find(new_r==r(i)); if isempty(nn),new_r=[new_r r(i)];endend%% step 3sum_zeros=0;%轮廓中总的点的个数for i=1:length(new_r) n=find(bwI(new_r(i),:)==1);%查找有白点的行中白点所在的位置 if length(n)==1,continue;end%如果该行中只有一个白点,则返回 num_zeros=n(end)-n(1)+1-length(n);%否则计算夹在白点之间的黑点的个数 sum_zeros=sum_zeros+num_zeros;end二值化图实例如下(即黑白两色):扩展资料:C语言实现源码:#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/core/core.hpp"#include #include #include "cv.h"#include "highgui.h"#include #include #include #include using namespace std;using namespace cv;//统计一幅图片中白色像素点和黑色像素点占整幅图的比例int bSums(Mat src){ int counter = 0; int black = 0; int n = 0; //迭代器访问像素点 Mat_::iterator it = src.begin(); Mat_::iterator itend = src.end(); for (; it != itend; ++it) { n++; if ((*it) > 0) { counter += 1;//二值化后,像素点是0或者255 } else { black += 1; } } double biliB = counter * 1.0 / n * 1.0 * 100 * 1.0; double biliH = black * 1.0 / n * 1.0 * 100 * 1.0; cout << "counter:" << counter << endl; cout << "black:" << black << endl; cout << "n:" << n << endl; cout << "biliB:" << biliB << endl; cout << "biliH:" << biliH << endl; return counter;}int main(int agrc, char** agrv){ Mat imgPath = imread("D://XR//811416.jpg");//读取源图 //namedWindow("原图", 0); //resizeWindow("原图", 500, 500); imshow("原图", imgPath); Mat a1; cvtColor(imgPath, a1, COLOR_BGR2GRAY);//转灰度图 //namedWindow("灰度", 0); //resizeWindow("灰度", 500, 500); imshow("灰度", a1); Mat a2; threshold(a1, a2, 0, 255, THRESH_BINARY | THRESH_OTSU);//二值化 //namedWindow("灰度", 0); //resizeWindow("灰度", 500, 500); imshow("灰度", a2); int a = bSums(a2);//调用函数bSums imshow("A", a2); //cout << "A:" << a; waitKey(); return 0;}

如何用matlab计算二值化图中白色区域的像素点个数

计算原理如下:假设一副二值图片,其背景是黑色的,而边缘是白色的,而且白色边缘中不包含黑色的点,就如附件中的那个图像。程序源码如下:%% step 1clear allclcI=imread('test.bmp');%读入图片bwI=im2bw(I,0.5);%转化为二值图像L=bwlabel(bwI,4);%将四连通区域进行标记[r,c]=find(L==1);%查找其中的白色区域,r是白点的所在行组成的向量,c是白点所在的列组成的向量%% step 2 %去除r中重复的数new_r=[];for i=1:length(r) nn=find(new_r==r(i)); if isempty(nn),new_r=[new_r r(i)];endend%% step 3sum_zeros=0;%轮廓中总的点的个数for i=1:length(new_r) n=find(bwI(new_r(i),:)==1);%查找有白点的行中白点所在的位置 if length(n)==1,continue;end%如果该行中只有一个白点,则返回 num_zeros=n(end)-n(1)+1-length(n);%否则计算夹在白点之间的黑点的个数 sum_zeros=sum_zeros+num_zeros;end二值化图实例如下(即黑白两色):扩展资料:C语言实现源码:#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/core/core.hpp"#include #include #include "cv.h"#include "highgui.h"#include #include #include #include using namespace std;using namespace cv;//统计一幅图片中白色像素点和黑色像素点占整幅图的比例int bSums(Mat src){ int counter = 0; int black = 0; int n = 0; //迭代器访问像素点 Mat_::iterator it = src.begin(); Mat_::iterator itend = src.end(); for (; it != itend; ++it) { n++; if ((*it) > 0) { counter += 1;//二值化后,像素点是0或者255 } else { black += 1; } } double biliB = counter * 1.0 / n * 1.0 * 100 * 1.0; double biliH = black * 1.0 / n * 1.0 * 100 * 1.0; cout << "counter:" << counter << endl; cout << "black:" << black << endl; cout << "n:" << n << endl; cout << "biliB:" << biliB << endl; cout << "biliH:" << biliH << endl; return counter;}int main(int agrc, char** agrv){ Mat imgPath = imread("D://XR//811416.jpg");//读取源图 //namedWindow("原图", 0); //resizeWindow("原图", 500, 500); imshow("原图", imgPath); Mat a1; cvtColor(imgPath, a1, COLOR_BGR2GRAY);//转灰度图 //namedWindow("灰度", 0); //resizeWindow("灰度", 500, 500); imshow("灰度", a1); Mat a2; threshold(a1, a2, 0, 255, THRESH_BINARY | THRESH_OTSU);//二值化 //namedWindow("灰度", 0); //resizeWindow("灰度", 500, 500); imshow("灰度", a2); int a = bSums(a2);//调用函数bSums imshow("A", a2); //cout << "A:" << a; waitKey(); return 0;}

matlab如何实现用颜色深浅来描述人数多少,即人数越多,该地块颜色越深,有点像热力图

请将你的原始图像保存为 1.jpg,然后调用下面的代码。这个与上一次解答问题类似(http://zhidao.baidu.com/question/2056108112801456027),主要是对区域编号采用手工编号(因为区域描述子出来的区域编号与你的图不一致,所以人工观察了一下,然后利用switch那段代码修改的,如regionprops中的1号区域对应你图像的3号区域)。clc; clear; close all;human = [1336.593, 1340, 9673.42, 460, 3600, 2520, 504, 1800, 1790, 720, 870];[~,sortI] = sort(human); imgori = imread('1.jpg');imgori = im2bw(imgori);imgcom = imfill(~imgori,'holes'); %反相填充,去除贴边区域img = imgori & imgcom;img = imfill(img,'holes'); % 区域描述子tmpregions = regionprops(img,'PixelList','BoundingBox','Centroid');% 去除字符内的闭合区域need = ones(1,length(tmpregions));for m = 1:length(tmpregions) bbm = tmpregions(m).BoundingBox; for n = 1:length(tmpregions) bbn = tmpregions(n).BoundingBox; if m~=n && bbm(1)bbn(1)+bbn(3) && bbm(2)+bbm(4)>bbn(2)+bbn(4) need(n) = 0; end endend% 保留的区域id = 1;for k = 1:length(tmpregions) if need(k)==1 regions(id) = tmpregions(k); id = id + 1; endendlength(regions) % 输出11% 区域手动编号map = zeros(size(img));for k = 1:length(regions)pl = regions(k).PixelList;for m = 1:size(pl,1)switch kcase 1, map(pl(m,2),pl(m,1))=find(sortI==3);case 2, map(pl(m,2),pl(m,1))=find(sortI==4);case 3, map(pl(m,2),pl(m,1))=find(sortI==2);case 4, map(pl(m,2),pl(m,1))=find(sortI==1);case 5, map(pl(m,2),pl(m,1))=find(sortI==5);case 6, map(pl(m,2),pl(m,1))=find(sortI==6);case 7, map(pl(m,2),pl(m,1))=find(sortI==8);case 8, map(pl(m,2),pl(m,1))=find(sortI==9);case 9, map(pl(m,2),pl(m,1))=find(sortI==10);case 10, map(pl(m,2),pl(m,1))=find(sortI==7);case 11, map(pl(m,2),pl(m,1))=find(sortI==11);endendendmap = map + 1;% 输出区域人数figure,imshow(img);hold on;for k = 1:length(regions) center = regions(k).Centroid; center = fix(center); text(center(1),center(2),num2str(human(sortI(map(center(2),center(1))-1))),'FontSize',15,'Color','r');end% 显示热力图figure;tmp = flipud(hot(12));tmp(1,:) = [0 0.5 0.4];% 背景色imshow(map, colormap(tmp));

matlab中如何对一条曲线和X轴之间的区域进行颜色的填充,比如一个高斯曲线下对应不同X段范围填充不同的颜

t=0:0.01:2*pi;y=sin(t);y2=y+2;plot(t,y,t,y2,'r');hold on% 如果t的维数较小,可以加细。n=length(t);for i=1:nx1=[t(i),t(i)];y1=[y(i),y2(i)];plot(x1,y1,'k');end美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中。为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。

上一篇:她200岁,南智贤的介绍

下一篇:厦门联合网,2021年财富世界500强出炉,排名第一的公司是哪一家?