OpenCV图像处理教程C++(十七)) 像素重映射以及漫水填充
2018-08-16 10:26
1151 查看
像素重映射(镜面成像):
把输入图像中各个像素按照一定的规则到另外一张图像的对应位置上去,形成一张新的图像。
Remap( src, dst, map1,//x映射表 CV_32FC1 map2,//y映射表 int interpolation,//选择的插值方法,常见线性插值INTER_LINEAR int borderMode,//BORDER_CONSTANT color)
代码:
#include <opencv2/opencv.hpp> #include<iostream> #include<math.h> #include <string> #include<fstream> using namespace cv; using namespace std; Mat src, dst,dst1,dst2, mapx, mapy; //int index = 2; void update_map( int index) { for (int row = 0; row < src.rows; row++) { for (int col = 0; col < src.cols; col++) { switch (index) { case 0: if (col > (src.cols*0.25) && col<(src.cols*0.75) && row>(src.rows*0.25) && row < (src.rows*0.75)) { mapx.at<float>(row, col) = 2 * (col - (src.cols*0.25) + 0.5); mapy.at<float>(row, col) = 2 * (row - (src.rows*0.25) + 0.5); } else { mapx.at<float>(row, col) = 0; mapy.at<float>(row, col) = 0; } break; case 1: mapx.at<float>(row, col) = (src.cols-col-1); mapy.at<float>(row, col) = row; break; case 2: mapy.at<float>(row, col) = (src.rows-row - 1); mapx.at<float>(row, col) = col; break; } } } } int main() { src = imread("C:\\Users\\Administrator\\Desktop\\pic\\1-H.jpg"); imshow("input", src); mapx.create(src.size(), CV_32FC1); mapy.create(src.size(), CV_32FC1); update_map(0); remap(src, dst, mapx, mapy, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 121)); imshow("dst", dst); update_map(1); remap(src, dst1, mapx, mapy, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 121)); imshow("dst1", dst1); update_map(2); remap(src, dst2, mapx, mapy, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 121)); imshow("dst2", dst2); waitKey(0); }
结果:
漫水填充法:
所谓漫水填充,简单来说,就是自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色,这是个非常有用的功能,经常用来标记或者分离图像的一部分进行处理或分析。漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点。
floodFill函数:
int floodFill(InputOutputArray image, //输入/输出1通道或3通道,8位或浮点图像 InputOutputArray mask, //掩模, Point seedPoint,//漫水填充算法的起始点 Scalar newVal, //像素点被染色的值,即在重绘区域像素的新值 Rect* rect=0, //用于设置floodFill函数将要重绘区域的最小边界矩形区域 Scalar loDiff=Scalar(), //表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之负差(lower brightness/color difference)的最大值 Scalar upDiff=Scalar(), //表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之正差(lower brightness/color difference)的最大值 int flags=4 )//
代码:
#include <opencv2/opencv.hpp> #include<iostream> #include<math.h> #include <string> #include<fstream> using namespace cv; using namespace std; Mat src, dst; int down = 20; int up = 20; void getFloodFill(int, void*) { Rect rect; floodFill(src, Point(60, 600), Scalar(121, 231, 12), &rect, Scalar(down, down, down), Scalar(up, up, up)); imshow("dst", src); } int main() { src = imread("C:\\Users\\Administrator\\Desktop\\pic\\5.jpg"); getFloodFill(0, 0); createTrackbar("负差最大值", "dst", &down, 255, getFloodFill); createTrackbar("正差最大值", "dst", &up, 255,getFloodFill); waitKey(0); }
结果:
阅读更多
相关文章推荐
- OpenCV图像处理教程C++(二十)轮廓发现、凸包、轮廓周围绘制圆和矩形
- OpenCV图像处理教程C++(二十一)图像矩、点多边形测试
- OpenCV图像处理教程C++(二十二)基于距离变换与分水岭的图像分割
- 【OpenCV】图像处理(三)漫水填充+尺寸调整
- OpenCV图像处理教程C++(十八) 直方图均衡化、计算、比较、反向投影
- OpenCV图像处理教程C++(十九)模板匹配
- 【第五课:C++和opencv】腐蚀处理图像
- 【OpenCV入门教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)
- Opencv教程基础篇(一)--MFC使用Opencv处理图像
- OpenCV学习C++接口:图像遍历+像素压缩
- 【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀
- 我的OpenCV学习笔记(三):利用操作像素完成简单的图像处理:加入椒盐噪声、图像翻转、改变对比度、图像锐化
- OpenCV入门三:OpenCV创建新图像以及遍历图片像素值和设置像素值
- vb.net 教程 5-13 图像处理之像素处理 5
- 【OpenCV入门教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)
- Python-OpenCV 处理图像(三):图像像素点操作
- 【OpenCV】OpenCV中获取图像的像素点并处理
- opencv(c++)图像处理(imgproc模块)[2]
- 图像处理之其他杂项(五)之水平集 LevelSet 代码实现 opencv c++ (转载)
- 【OpenCV图像处理入门学习教程一】OpenCV2 + 3的安装教程与VS2013的开发环境配置 + JPEG压缩源码分析与取反运算修改