【20160924】GOCVHelper 图像增强部分(1)

图像增强是图像处理的第一步。这里集成了一些实际使用过程中有用的函数。

//读取灰度或彩色图片到灰度

Mat imread2gray(string path){

Mat src = imread(path);

Mat srcClone = src.clone();

if (CV_8UC3 == srcClone.type() )

cvtColor(srcClone,srcClone,CV_BGR2GRAY);

return srcClone;

}

算法核心在于判断读入图片的通道数,如果是灰度图片则保持;如果是彩色图片则转换为灰度图片。通过这样一个函数,就能够直接获得灰度图片。

//带有上下限的threshold

Mat threshold2(Mat src,int minvalue,int maxvalue){

Mat thresh1;

Mat thresh2;

Mat dst;

threshold(src,thresh1,minvalue,255, THRESH_BINARY);

threshold(src,thresh2,maxvalue,255,THRESH_BINARY_INV);

dst = thresh1 & thresh2;

return dst;

}

Opencv提供的threshold算法很强大,但是只能够取单门限。这里修改成可以取双门限的形式。

//自适应门限的canny算法

//canny2

Mat canny2(Mat src){

Mat imagetmp = src.clone();

double low_thresh = 0.0;

double high_thresh = 0.0;

AdaptiveFindThreshold(imagetmp,&low_thresh,&high_thresh);

Canny(imagetmp,imagetmp,low_thresh,high_thresh);

return imagetmp;}

void AdaptiveFindThreshold( Mat src,double *low,double *high,int aperture_size){

const int cn = src.channels();

Mat dx(src.rows,src.cols,CV_16SC(cn));

Mat dy(src.rows,src.cols,CV_16SC(cn));

Sobel(src,dx,CV_16S,1,0,aperture_size,1,0,BORDER_REPLICATE);

Sobel(src,dy,CV_16S,0,1,aperture_size,1,0,BORDER_REPLICATE);

CvMat _dx = dx;

CvMat _dy = dy;

_AdaptiveFindThreshold(&_dx, &_dy, low, high); }

void _AdaptiveFindThreshold(CvMat *dx, CvMat *dy, double *low, double *high){

CvSize size;

IplImage *imge=0;

int i,j;

CvHistogram *hist;

int hist_size = 255;

float range_0[]={0,256};

float* ranges[] = { range_0 };

double PercentOfPixelsNotEdges = 0.7;

size = cvGetSize(dx);

imge = cvCreateImage(size, IPL_DEPTH_32F, 1);

// 计算边缘的强度, 并存于图像中

float maxv = 0;

for(i = 0; i < size.height; i++ ){

const short* _dx = (short*)(dx->data.ptr + dx->step*i);

const short* _dy = (short*)(dy->data.ptr + dy->step*i);

float* _image = (float *)(imge->imageData + imge->widthStep*i);

for(j = 0; j < size.width; j++){

_image[j] = (float)(abs(_dx[j]) + abs(_dy[j]));

maxv = maxv < _image[j] ? _image[j]: maxv;}}

if(maxv == 0){

*high = 0;

*low = 0;

cvReleaseImage( &imge );

return;}

// 计算直方图

range_0[1] = maxv;

hist_size = (int)(hist_size > maxv ? maxv:hist_size);

hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);

cvCalcHist( &imge, hist, 0, NULL );

int total = (int)(size.height * size.width * PercentOfPixelsNotEdges);

float sum=0;

int icount = hist->mat.dim[0].size;

float *h = (float*)cvPtr1D( hist->bins, 0 );

for(i = 0; i < icount; i++){

sum += h[i];

if( sum > total )

break; }

// 计算高低门限

*high = (i+1) * maxv / hist_size ;

*low = *high * 0.4;

cvReleaseImage( &imge );

cvReleaseHist(&hist); }

// end of canny2
         我们在使用Opencv的canny算法的时候,一般是按照经验填写上下门限值。为了解决这个问题,通过自适应算法(算法来源我想不起来了),自动计算出上下门限。能够取得不错效果。

来自为知笔记(Wiz)

时间: 2024-10-15 13:00:26

【20160924】GOCVHelper 图像增强部分(1)的相关文章

【20160924】GOCVHelper 图像增强部分(4)

//使得rect区域半透明 Mat translucence(Mat src,Rect rect,int idepth){ Mat dst = src.clone(); Mat roi = dst(rect); roi += cv::Scalar(idepth,idepth,idepth); return dst; } 将选择的区域打上变成半透明.虽然这只是一个简单的函数,但是使用起来灵活多变. 比如说,可以将图像某个区域变成半透明,然后在上面写字,这样起到强化作用: 也可以将一个区域图片在半透

【20160924】GOCVHelper 图像增强部分(2)

//填充孔洞 //fillholes Mat fillHoles(Mat src){ Mat dst = getInnerHoles(src); threshold(dst,dst,0,255,THRESH_BINARY_INV); dst = src + dst; return dst; } //获得图像中白色的比率 float getWhiteRate(Mat src){ int iWhiteSum = 0; for (int x =0;x<src.rows;x++){ for (int y

【20160924】GOCVHelper 图像增强部分(5)

// Multiply 正片叠底 void Multiply(Mat& src1, Mat& src2, Mat& dst) { for(int index_row=0; index_row<src1.rows; index_row++) { for(int index_col=0; index_col<src1.cols; index_col++) { for(int index_c=0; index_c<3; index_c++) dst.at<Vec3

【20160924】GOCVHelper 图像增强部分(3)

//顶帽去光差,radius为模板半径 Mat moveLightDiff(Mat src,int radius){ Mat dst; Mat srcclone = src.clone(); Mat mask = Mat::zeros(radius*2,radius*2,CV_8U); circle(mask,Point(radius,radius),radius,Scalar(255),-1); //顶帽 erode(srcclone,srcclone,mask); dilate(srcclo

基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的功能增强. 这里将算法库开放源代码,并且编写一系列blog对函数实现进行说明.目的是在于“取之于互联网,用之于互联网”.并且也希望该库能够继续发展下去. 由于算法库基于Opencv和Mfc进行编写,所以要求阅读使用者具备一定基础. 最终提交的是GOCVHelper.h 和GOCVHelper版本号.

【20160924】GOCVHelper综述

GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的功能增强. 这里将算法库开放源代码,并且编写一系列blog对函数实现进行说明.目的是在于“取之于互联网,用之于互联网”.并且也希望该库能够继续发展下去. 由于算法库基于Opencv和Mfc进行编写,所以要求阅读使用者具备一定基础. 最终提交的是GOCVHelper.h 和GOCVHelper版本号.

【20160924】GOCVHelper MFC增强算法(5)

CString ExportListToExcel(CString  sExcelFile,CListCtrl* pList, CString strTitle) { CString warningStr; if (pList->GetItemCount ()>0) { CDatabase database; CString sSql; CString tableName = strTitle; // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*

【20160924】GOCVHelper 图像处理部分(1)

增强后的图像需要通过图像处理获得定量的值.在实际程序设计过程中,轮廓很多时候都是重要的分析变量.参考Halcon的相关函数,我增强了Opencv在这块的相关功能.      //寻找最大的轮廓 VP FindBigestContour(Mat src){ int imax = 0; //代表最大轮廓的序号 int imaxcontour = -1; //代表最大轮廓的大小 std::vector<std::vector<cv::Point>>contours; findContou

【20160924】GOCVHelper 图像处理部分(3)

//根据轮廓的圆的特性进行选择 vector<VP> selectShapeCircularity(Mat src,Mat& draw,vector<VP> contours,float minvalue,float maxvalue){ vector<VP> result_contours; draw = Mat::zeros(src.rows,src.cols,CV_8UC3); for (int i=0;i<contours.size();i++){