opencv 图片基本处理(灰度化,反色,二值化,膨胀腐蚀以及ROI的copy等)
来源:互联网 发布:淘宝店铺营销亮点 编辑:程序博客网 时间:2024/06/05 20:37
基于护照的识别和特征提取,使用opencv2.4.9在VS2012里做的。直接上代码:
#include <cv.h>
#include <highgui.h>
#include <string>
using namespace cv;
using namespace std;
#define image_name "z001z.bmp"
#define corrode_index 1 //腐蚀指数
int otsu(const IplImage *src_image) //大津法求阈值
{
double sum = 0.0;
double w0 = 0.0;
double w1 = 0.0;
double u0_temp = 0.0;
double u1_temp = 0.0;
double u0 = 0.0;
double u1 = 0.0;
double delta_temp = 0.0;
double delta_max = 0.0;
//src_image灰度级
int pixel_count[256]={0};
float pixel_pro[256]={0};
int threshold = 0;
uchar* data = (uchar*)src_image->imageData;
//统计每个灰度级中像素的个数
for(int i = 0; i < src_image->height; i++)
{
for(int j = 0;j < src_image->width;j++)
{
pixel_count[(int)data[i * src_image->width + j]]++;
sum += (int)data[i * src_image->width + j];
}
}
cout<<"平均灰度:"<<sum / ( src_image->height * src_image->width )<<endl;
//计算每个灰度级的像素数目占整幅图像的比例
for(int i = 0; i < 256; i++)
{
pixel_pro[i] = (float)pixel_count[i] / ( src_image->height * src_image->width );
}
//遍历灰度级[0,255],寻找合适的threshold
for(int i = 0; i < 256; i++)
{
w0 = w1 = u0_temp = u1_temp = u0 = u1 = delta_temp = 0;
for(int j = 0; j < 256; j++)
{
if(j <= i) //背景部分
{
w0 += pixel_pro[j];
u0_temp += j * pixel_pro[j];
}
else //前景部分
{
w1 += pixel_pro[j];
u1_temp += j * pixel_pro[j];
}
}
u0 = u0_temp / w0;
u1 = u1_temp / w1;
delta_temp = (float)(w0 *w1* pow((u0 - u1), 2)) ;
if(delta_temp > delta_max)
{
delta_max = delta_temp;
threshold = i;
}
}
return threshold;
}
void front(IplImage *imgdst )//前面图片处理
{
IplImage* img_black = cvCreateImage(cvGetSize(imgdst),IPL_DEPTH_8U,1);
cvSet(img_black,cvScalar(0),NULL);
cvSetImageROI(imgdst, cvRect(8, 145, 162, 255)); //为图象设置ROI区域
cvSetImageROI(img_black, cvRect(8, 145, 162, 255));
cvCopy(imgdst,img_black,NULL);
cvResetImageROI(imgdst);
cvResetImageROI(img_black);
cvSetImageROI(imgdst, cvRect(285, 122,245,245)); //为图象设置ROI区域
cvSetImageROI(img_black, cvRect(285, 122,245,245));
cvCopy(imgdst,img_black,NULL);
cvResetImageROI(imgdst);
cvResetImageROI(img_black);
cvSaveImage("正面结果.jpg",img_black);
cvShowImage("copy.jpg",img_black);
cvWaitKey(0);
}
void back(IplImage *imgsrc ,IplImage *imgdst)//后面图片处理
{
IplImage* img_back = cvCreateImage(cvGetSize(imgdst),IPL_DEPTH_8U,1);
cvAdd(imgsrc,imgdst,img_back);
//创建纯黑图
IplImage* img_black = cvCreateImage(cvGetSize(imgdst),IPL_DEPTH_8U,1);
cvSet(img_black,cvScalar(0),NULL);
cvSetImageROI(img_back, cvRect(22,22,727,477)); //为图象设置ROI区域
cvSetImageROI(img_black, cvRect(22,22,727,477));
cvCopy(img_back,img_black,NULL);
cvResetImageROI(img_back);
cvResetImageROI(img_black);
cvSaveImage("反面结果.jpg",img_black);
cvShowImage("copy.jpg",img_black);
cvWaitKey(0);
}
int main()
{
IplImage *imgsrc = cvLoadImage(image_name,1);
if (!imgsrc)
{
cout<<"Could not open or find the image!"<<endl;
return -1;
}
IplImage* imgdst =NULL;
imgdst=cvCreateImage(cvGetSize(imgsrc),IPL_DEPTH_8U,1);
IplImage* img_temp =NULL;
img_temp=cvCreateImage(cvGetSize(imgsrc),IPL_DEPTH_8U,1);
//灰度化
cvCvtColor(imgsrc,imgdst,CV_BGR2GRAY);
cvSaveImage("灰度化.jpg",imgdst);
imgsrc=imgdst;
int height = imgsrc->height; // 图像高度
int width = imgsrc->width; // 图像宽度(像素为单位)
int step = imgsrc->widthStep; // 相邻行的同列点之间的字节数
int channels = imgsrc->nChannels; // 颜色通道数目 (1,2,3,4)
uchar *data = (uchar *)imgsrc->imageData;
//反色操作
for(int i=0;i != height; ++ i)
{
for(int j=0;j != width; ++ j)
{
for(int k=0;k != channels; ++ k)
{
data[i*step+j*channels+k]=255-data[i*step+j*channels+k];
}
}
}
cvSaveImage("反色.jpg",imgsrc);
//局部二值化
int blockSize = 15;
int constValue = 10;
cvAdaptiveThreshold(imgsrc, imgdst, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);
cvSaveImage("二值化.jpg",imgdst);
img_temp=imgdst;
cvErode(imgsrc,imgdst,NULL,corrode_index);//腐蚀图像
cvSaveImage("腐蚀结果.jpg", imgdst);
imgsrc = imgdst;
cvDilate(imgsrc,imgdst,NULL,1);//膨胀图像
cvSaveImage("膨胀结果.jpg", imgdst);
//不同类型图片处理函数不同
front(imgdst);
//back(imgdst,img_temp);
cvReleaseImage( &imgsrc );
return 0;
}
- opencv 图片基本处理(灰度化,反色,二值化,膨胀腐蚀以及ROI的copy等)
- 一些基本的opencv图像预处理函数直接用法(灰度化,otsu二值化,腐蚀膨胀,canny)
- 图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算
- OpenCV实现图片的膨胀和腐蚀
- 腐蚀,膨胀,opencv的形态学处理
- 灰度图像的腐蚀膨胀
- 图片的膨胀与腐蚀处理
- 图像处理(六)灰度形态学腐蚀与膨胀
- 灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算
- 腐蚀、膨胀以及开闭操作等形态学处理
- Opencv 基础学习二(对图片进行腐蚀处理、膨胀处理)
- opencv 图像的 腐蚀 膨胀
- 灰度图像--形态学处理:腐蚀、膨胀、开操作、闭操作、顶帽、底帽等
- Opencv对图像做腐蚀和膨胀处理的结果
- 6基于opencv的形态学处理(一)腐蚀_膨胀
- 灰度图像的腐蚀与膨胀
- 灰度图像的腐蚀与膨胀
- Opencv-图像形态学处理比较(膨胀、腐蚀、开闭)
- Linux学习笔记:虚拟机设置中的各种网络连接方式详解
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇二:WinForm开发扇形图统计和Excel数据导出
- 看操作系统虚拟化原理总结篇——虚拟化概述原理
- Maven查找使用的包
- iphone手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognizer
- opencv 图片基本处理(灰度化,反色,二值化,膨胀腐蚀以及ROI的copy等)
- C ++ 抽象工厂模型
- UVa989 - Su Doku(数独游戏)
- c 函数指针
- Android 开发指导文档(译)-- Bound Services
- 空间大地测量与GPS导航定位时间系统相互转换,格里高利时通用时儒略日,GPS时,年积日相互转换
- BCB操作注册表
- 程序猿进化史——分解数字
- 基于RFID的智能旅游CY-RAT-101/102游客管理系统