灰度变换、自适应高斯滤波、平滑滤波、canny边缘检测、直线霍夫变换
来源:互联网 发布:暗黑破坏神2 mac 补丁 编辑:程序博客网 时间:2024/05/21 19:49
这是我第一次写博客,主要是记录自己的学习历程,帮助像我这样的新学者提供一点点思路。
我用的opencv版本是2.4.9 和 vs2010 版本比较旧。
这里面主要有灰度变换、自适应高斯滤波、平滑滤波、canny边缘检测、直线霍夫变换,还有一个旋转变换没有实验,里面还有Mat和IplImage图像转换。
#include "stdafx.h"#include <opencv2/opencv.hpp>using namespace cv;//C++ interface enableconst char* pStrWinddowsBinaryTitle="二值图";const char* pStrGasTitle="高斯";const char* pStrSrcTitle="原图";const char* pStrWindowsToolBarName = "二值图阈值"; const char* pStrName="adaptive";IplImage* pSrcImage=NULL; //此处是在使用C接口的opencv创建的对象IplImage *pGrayImage = NULL; IplImage* pDstImage=NULL;IplImage* pGasImage=NULL;Mat mCannyImage,mGrayImage,mBlurImage,mGaussian,mDstImage,mRangeImage,mAdaptiveThresholdImage;;int _blocksize = 0;int _param1 = 0;//拖动条回掉函数void on_trackbar(int pos){ // 转为二值图 cvThreshold(pGrayImage, pDstImage, pos, 255, CV_THRESH_BINARY); // 显示二值图 cvShowImage(pStrWinddowsBinaryTitle, pDstImage); cvSmooth(pDstImage,pGasImage,CV_GAUSSIAN,7,7,0,0); cvNamedWindow(pStrGasTitle, CV_WINDOW_AUTOSIZE); cvShowImage(pStrGasTitle,pGasImage);}void on_track(int ,void*){ int blocksize = _blocksize * 2 + 3; //计算阈值的像素邻域大小3,5,7... 13比较好 int param1 = _param1 - 50; //被均值和加权均值减去的常量, 范围取[-50,50] -50比较好 adaptiveThreshold(mGrayImage,mAdaptiveThresholdImage,200,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,blocksize,param1); imshow(pStrName,mAdaptiveThresholdImage);}void rotateImage(IplImage* img, IplImage *img_rotate,int degree) { //旋转中心为图像中心 CvPoint2D32f center; center.x=float (img->width/2.0+0.5); center.y=float (img->height/2.0+0.5); //计算二维旋转的仿射变换矩阵 float m[6]; CvMat M = cvMat( 2, 3, CV_32F, m ); cv2DRotationMatrix( center, degree,1, &M); //变换图像,并用黑色填充其余值 cvWarpAffine(img,img_rotate, &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) ); } int main(int argc, char* argv[]){ Mat mSrcImage=imread("001.jpg");//C:\\Users\\Junqi\\Desktop\\潘晓婷.jpg /*mCannyImage.create(mSrcImage.size(),mSrcImage.type()); mGrayImage.create(mSrcImage.size(),mSrcImage.type()); mBlurImage.create(mSrcImage.size(),mSrcImage.type()); mCannyImage.create(mSrcImage.size(),mSrcImage.type()); mGaussian.create(mSrcImage.size(),mSrcImage.type());*/ cvtColor(mSrcImage,mGrayImage,CV_BGR2GRAY); //inRange(mGrayImage,50,150,mRangeImage); GaussianBlur(mGrayImage,mGaussian,Size(5,5),5,5,4); blur(mGaussian,mBlurImage,Size(9,9)); Canny(mBlurImage,mCannyImage,50,150,3,false);// mDstImage=Scalar::all(0);// mSrcImage.copyTo(mDstImage,mCannyImage); IplImage* iGaryImage=&IplImage(mGrayImage); //Mat aaa(iGaryImage); Mat aaa=iGaryImage; cvNamedWindow("iii",CV_WINDOW_AUTOSIZE); cvShowImage("iii",iGaryImage); cvNamedWindow(pStrName, CV_WINDOW_AUTOSIZE); createTrackbar("blockSize",pStrName,&_blocksize,50,on_track); createTrackbar("param1",pStrName,&_param1,100,on_track); vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合 HoughLinesP(mCannyImage, lines, 1, CV_PI/180, 80, 50, 10 ); //【4】依次在图中绘制出每条线段 for( size_t i = 0; i < lines.size(); i++ ) { Vec4i l = lines[i]; line( mCannyImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186,88,255), 5, CV_AA); } cvNamedWindow(pStrSrcTitle,CV_WINDOW_AUTOSIZE);//while using the function of imshow ,this function can be ignore imshow(pStrSrcTitle,mSrcImage); imshow("Range",mRangeImage); imshow("Gray",mGrayImage); imshow("BLur",mBlurImage); imshow("Gaussian",mGaussian); imshow("Canny",mCannyImage); imshow("Final",mDstImage); imshow("aaa",aaa); cvWaitKey(0); destroyWindow(pStrSrcTitle); /* pSrcImage=cvLoadImage("001.jpg",1); pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1); pGasImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1); pDstImage=cvCreateImage(cvGetSize((pSrcImage)),IPL_DEPTH_8U,1); cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY); //GaussianBlur(pGrayImage,pGasImage,Size(5,5),0,0); cvNamedWindow(pStrSrcTitle,CV_WINDOW_AUTOSIZE); cvShowImage(pStrSrcTitle,pSrcImage); warpAffine(pSrcImage,); cvNamedWindow(pStrWinddowsBinaryTitle,CV_WINDOW_AUTOSIZE); int nThreshold = 0; // 创建二值图窗口 cvCreateTrackbar(pStrWindowsToolBarName, pStrWinddowsBinaryTitle, &nThreshold, 254, on_trackbar); on_trackbar(1); cvWaitKey(0); cvDestroyWindow(pStrSrcTitle); cvDestroyWindow(pStrGasTitle); cvDestroyWindow(pStrWinddowsBinaryTitle); cvReleaseImage(&pSrcImage); cvReleaseImage(&pGasImage); cvReleaseImage(&pDstImage); cvReleaseImage(&pGrayImage);*/ return 0;}
这就是一些代码,没有贴出来结果,大家可以试一试,有问题可以联系我。
1 0
- 灰度变换、自适应高斯滤波、平滑滤波、canny边缘检测、直线霍夫变换
- 高斯滤波及canny边缘检测代码实现
- 图像处理平滑处理--高斯滤波,简单模糊,中值模糊,双边滤波,简单无放缩变换
- 灰度变换与空间滤波
- 灰度变换与空间滤波
- 灰度变换和空间滤波
- 灰度变换与空间滤波
- opencv调用摄像头+灰度图+高斯滤波+Canny算子
- canny边缘提取之二 高斯图像滤波
- Canny边缘检测、霍夫直线、霍夫圆
- OPENCV霍夫变换使用方法——边缘检测+霍夫变换求出图像中的直线
- OPENCV霍夫变换使用方法——边缘检测+霍夫变换求出图像中的直线
- 图像变换 - Canny算子边缘检测(cvCanny)
- 图像基本变换---Canny边缘检测算法
- 灰度变换与空间滤波摘要
- 灰度变换与空间滤波-学习提纲
- 图像处理 灰度变换与空间滤波
- 第二章 灰度变换与空间滤波
- SQL Server数据库操作(三)
- keil中printf函数及bin文件生成问题
- Java 运算符
- C#socket通信(客户端和服务端)
- BP算法公式推导
- 灰度变换、自适应高斯滤波、平滑滤波、canny边缘检测、直线霍夫变换
- Win10开发6
- Java 循环结构 - for, while 及 do...while
- 常见的Word操作技巧
- SDK docs
- 傅里叶变换处理图像例子
- fullcalendar,轻松管理日程
- 对superblock的理解
- 如何在代码中动态改变radioButton的图片位置?