OpenCV图像处理教程C++(十七)) 像素重映射以及漫水填充

像素重映射(镜面成像):
把输入图像中各个像素按照一定的规则到另外一张图像的对应位置上去,形成一张新的图像。

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);
}

结果:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_26907755/article/details/81736854
今日推荐