OpenCV imgproc组件之图像变换
2017-08-31 18:47
239 查看
该部分主要包括边缘检测、霍夫变换、重映射、仿射变换和直方图均衡化几种操作,下面用具体例子分别介绍图像变换函数的使用。
#include<iostream> #include<opencv2\opencv.hpp> #include<vector> using namespace std; enum EdgeType { CANNY = 0, SOBEL, LAPLACIAN, SCHARR }; //边缘检测 bool edgeFind(cv::Mat &src, cv::Mat &dst, EdgeType type = CANNY) { cv::Mat edge,edge_x,edge_y; edge = src.clone(); //cv::cvtColor(src, edge, CV_RGB2GRAY); cv::cvtColor(src, edge_x, CV_RGB2GRAY); cv::cvtColor(src, edge_y, CV_RGB2GRAY); switch (type) { case CANNY: cv::Canny(edge, edge, 40, 100, 3); break; case SOBEL: cv::Sobel(edge, edge_x, edge.depth(), 1, 0, 3); cv::Sobel(edge, edge_y, edge.depth(), 0, 1, 3); cv::convertScaleAbs(edge_x, edge_x); cv::convertScaleAbs(edge_y, edge_y); edge = edge_x + edge_y; break; case LAPLACIAN: cv::Laplacian(edge, edge, edge.depth(), 3, 1, 0); break; case SCHARR: cv::Scharr(edge, edge_x, edge.depth(), 1, 0, 3); cv::Scharr(edge, edge_y, edge.depth(), 0, 1, 3); cv::convertScaleAbs(edge_x, edge_x); cv::convertScaleAbs(edge_y, edge_y); edge = edge_x + edge_y; break; } cv::imshow("edge", edge); dst = cv::Scalar::all(0); src.copyTo(dst, edge); return true; } bool houghChange(cv::Mat &src, cv::Mat &dst) { vector<cv::Vec2f> lines; cv::Mat src1; cv::Canny(src, src1,10,50); //cv::cvtColor(src1, src1, CV_GRAY2BGR); HoughLines(src1, lines, 1, 3.14 / 180, 150); dst.create(src.size(),src.type()); for (int i = 0; i < lines.size(); i++) { float rho = lines[i][0], theta = lines[i][1]; cv::Point pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000 * (-b)); pt1.y = cvRound(y0 + 1000 * (a)); pt2.x = cvRound(x0 - 1000 * (-b)); pt1.y = cvRound(y0 - 1000 * (a)); line(dst, pt1, pt2, cv::Scalar(55, 100, 195), 1); } return true; } bool remap(cv::Mat &src, cv::Mat &dst) { cv::Mat map_x, map_y; dst.create(src.size(), src.type()); map_x.create(src.size(), CV_32FC1); map_y.create(src.size(), CV_32FC1); for (int j = 0; j < src.rows; j++) for (int i = 0; i < src.cols; i++) { map_x.at<float>(j, i) = static_cast<float>(i); map_y.at<float>(j, i) = static_cast<float>(src.rows - j); } cv::remap(src, dst, map_x, map_y,CV_INTER_LINEAR); return true; } void affineTransformation(cv::Mat &src, cv::Mat &dst) { // cv::flip(src, dst, 0);//参数3==0垂直翻转(沿X轴翻转),参数3>0水平翻转(沿Y轴翻转),参数3<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180° cv::Point center = cv::Point(src.cols / 2, src.rows / 2); double angle = 30; double scale = 0.8; cv::Mat rotMat(2, 3, CV_32FC1); rotMat = cv::getRotationMatrix2D(center, angle, scale); cv::warpAffine(src, dst, rotMat, dst.size()); } int main() { cv::Mat src = cv::imread("D:\\OpenCVprivate\\5.jpg"); cv::Mat morphDst, resizeDst, floodDst, filterDst, thsDst, edgeDst, eqDst, houghDst, affineDst, remapDst; // cv::imshow("原图", src); edgeFind(src, edgeDst);//边缘检测 cv::imshow("edgeDst", edgeDst); houghChange(src, houghDst);//霍夫变换 cv::imshow("houghDst", houghDst); affineTransformation(src, affineDst);//仿射变换 cv::imshow("affineDst", affineDst); remap(src, remapDst);//重映射 cv::imshow("remapDst", remapDst); cv::cvtColor(src, eqDst, CV_RGB2GRAY); cv::equalizeHist(eqDst, eqDst);//直方图均衡化 cv::imshow("eqDst", eqDst); cv::waitKey(); return 0; }
相关文章推荐
- 【OpenCV】OpenCV3的第六天——imgproc组件之图像变换
- 【OpenCV】OpenCV3的第五天——imgproc组件之图像处理
- OpenCV imgproc组件之 图像处理
- OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc
- opencv学习笔记4:图像变换
- 学习OpenCV(四) 改变图像的对比度和亮度——像素变换
- opencv中的图像亮度变换(图像增强)
- opencv6.2-imgproc图像处理模块之图像尺寸上的操作及阈值
- 图像的仿射变换与透视变换opencv
- OpenCV学习笔记(基于OpenCV 2.4)二:图像的加载显示及简单变换
- OpenCV-基于傅里叶变换的旋转文本图像矫正实现
- opencv-第六章-图像变换-重映射、仿射变换、透视变换
- 【OpenCV】OpenCV3的第七天——imgproc组件之直方图相关
- 学习OpenCV(四) 改变图像的对比度和亮度——像素变换
- 关于OpenCv图像变换与基本图形检测
- 第三篇 学习OpenCV之图像变换(2)
- 5 用python进行OpenCV实战之图像变换2(旋转)
- OpenCV 下面的图像亮度变换 Intensity transformation
- [opencv] 将摄像头图像做镜像变换(split, merge, 矩阵相乘)
- 【OpenCV】图像的变换(三)-Canny边缘检测