您的位置:首页 > 编程语言

图片二值化 opencv实现 代码及分析

2012-09-25 17:04 429 查看
1.图片二值化概念

就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。

在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能突显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。

2.实现代码分析

基本思想:将RGB彩色图片对应到灰度图像上,但是最后通过一个阀值,将灰度值极端地设为255和0.

具体实现:R,G,B三色值相加/3,若值大于128,则将该点的灰度值设为255;若小于128,则设为0.

实际代码:(运行环境:Win7 64位 / opencv2.3 / VS2010)

#include <iostream>
#include <string>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>
#include <iostream>
using namespace std;

int main ()
{
IplImage* img = cvLoadImage("lena.jpg",-1);
IplImage* biimg = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
CvScalar s;
int sum=0;

for (int i=0;i<img->height;i++)
{
for (int j=0;j<img->width;j++)
{
s =  cvGet2D(img,i,j);
//cout<<s.val[0]<<" "<<s.val[1]<<" "<<s.val[2]<<endl;
sum = (s.val[0]+s.val[1]+s.val[2])/3;
if (sum > 128)
{
s.val[0]=s.val[1]=s.val[2]=255;
cvSet2D(biimg,i,j,s);
}
else
{
s.val[0]=s.val[1]=s.val[2]=0;
cvSet2D(biimg,i,j,s);
}
}
}

cvSaveImage("new.jpg",biimg);

cvNamedWindow("SourceImage");
cvShowImage("SourceImage",img);

cvNamedWindow("imagebinary");
cvShowImage("imagebinary",biimg);

cvWaitKey(0);

cvDestroyWindow("SourceImage");
cvDestroyWindow("imagebinary");

cvReleaseImage(&img);
cvReleaseImage(&biimg);
}


3.运行结果:



 

4.核心分析

CvScalar 定义可存放1—4个数值的数值,其结构如下。

typedef struct CvScalar

{

    double val[4];

}

CvScalar;

------------------------------------------------

CvScalar pt;

如果使用的图像是1通道的,则pt.val[0]中存储数据

如果使用的图像是3通道的,则pt.val[0],pt.val[1],pt.val[2]中存储数据

==============================

cvGet2D 获得某个点的值, idx0=hight 行值, idx1=width 列值。

CVAPI(CvScalar) cvGet2D( const CvArr* arr, int idx0, int idx1 );

 -----------------------------------------------

cvSet2D 给某个点赋值。

CVAPI(void) cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );

 -----------------------------------------------

由上可见,cvGet2D的返回类型和cvSet2D中value的类型都是CvScalar,这样定义一个CvScalar变量再调用函数就OK了。

CvScalar s = cvSum(arr);

s.val[0]:数组arr中的B通道值的和,double类型

s.val[1]:数组arr中的G通道值的和,double类型

s.val[2]:数组arr中的R通道值的和,double类型

s.val[3]:数组arr中的alphe通道值的和,double类型

 

5.参考链接:

[1]http://baike.baidu.com/view/1532602.htm

[2]http://blog.sina.com.cn/s/blog_5f2c831b0100pzuu.html

[3]http://blog.sina.com.cn/s/blog_4ffc4c3001010hyb.html

 

*********** 转载请注明出处 ***********
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息