【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(srcclone,srcclone,mask);

dst =  src - srcclone;

return dst;

}

算法来自于冈萨雷斯《数字图像处理教程》形态学篇章。完全按照教程实现,具备一定作用。

//将 DEPTH_8U型二值图像进行细化  经典的Zhang并行快速细化算法

//细化算法

void thin(const Mat &src, Mat &dst, const int iterations){

const int height =src.rows -1;

const int width  =src.cols -1;

//拷贝一个数组给另一个数组

if(src.data != dst.data)

src.copyTo(dst);

int n = 0,i = 0,j = 0;

Mat tmpImg;

uchar *pU, *pC, *pD;

bool isFinished =FALSE;

for(n=0; n<iterations; n++){

dst.copyTo(tmpImg);

isFinished =FALSE;   //一次 先行后列扫描 开始

//扫描过程一 开始

for(i=1; i<height;  i++) {

pU = tmpImg.ptr<uchar>(i-1);

pC = tmpImg.ptr<uchar>(i);

pD = tmpImg.ptr<uchar>(i+1);

for(int j=1; j<width; j++){

if(pC[j] > 0){

int ap=0;

int p2 = (pU[j] >0);

int p3 = (pU[j+1] >0);

if (p2==0 && p3==1)

ap++;

int p4 = (pC[j+1] >0);

if(p3==0 && p4==1)

ap++;

int p5 = (pD[j+1] >0);

if(p4==0 && p5==1)

ap++;

int p6 = (pD[j] >0);

if(p5==0 && p6==1)

ap++;

int p7 = (pD[j-1] >0);

if(p6==0 && p7==1)

ap++;

int p8 = (pC[j-1] >0);

if(p7==0 && p8==1)

ap++;

int p9 = (pU[j-1] >0);

if(p8==0 && p9==1)

ap++;

if(p9==0 && p2==1)

ap++;

if((p2+p3+p4+p5+p6+p7+p8+p9)>1 && (p2+p3+p4+p5+p6+p7+p8+p9)<7){

if(ap==1){

if((p2*p4*p6==0)&&(p4*p6*p8==0)){

dst.ptr<uchar>(i)[j]=0;

isFinished =TRUE;

}

}

}

}

} //扫描过程一 结束

dst.copyTo(tmpImg);

//扫描过程二 开始

for(i=1; i<height;  i++){

pU = tmpImg.ptr<uchar>(i-1);

pC = tmpImg.ptr<uchar>(i);

pD = tmpImg.ptr<uchar>(i+1);

for(int j=1; j<width; j++){

if(pC[j] > 0){

int ap=0;

int p2 = (pU[j] >0);

int p3 = (pU[j+1] >0);

if (p2==0 && p3==1)

ap++;

int p4 = (pC[j+1] >0);

if(p3==0 && p4==1)

ap++;

int p5 = (pD[j+1] >0);

if(p4==0 && p5==1)

ap++;

int p6 = (pD[j] >0);

if(p5==0 && p6==1)

ap++;

int p7 = (pD[j-1] >0);

if(p6==0 && p7==1)

ap++;

int p8 = (pC[j-1] >0);

if(p7==0 && p8==1)

ap++;

int p9 = (pU[j-1] >0);

if(p8==0 && p9==1)

ap++;

if(p9==0 && p2==1)

ap++;

if((p2+p3+p4+p5+p6+p7+p8+p9)>1 && (p2+p3+p4+p5+p6+p7+p8+p9)<7){

if(ap==1){

if((p2*p4*p8==0)&&(p2*p6*p8==0)){

dst.ptr<uchar>(i)[j]=0;

isFinished =TRUE;

}

}

}

}

}

} //一次 先行后列扫描完成

//如果在扫描过程中没有删除点,则提前退出

if(isFinished ==FALSE)

break;

}

}

}

#end of thin

细化算法,在处理毛笔字一类的时候效果很好。使用的过程中,注意需要保留的部分要处理为白色,也就是scalar(255)

来自为知笔记(Wiz)

时间: 2024-10-17 19:49:19

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

【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 图像增强部分(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; } 算法核心在于判断读入图片的通道数,如果是灰度图片则

【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

基于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++){