像素重映射

it2025-05-06  22

图像像素重映射

理解的有问题(像素的具体值还和插值方式有关,这应该只是行数和列数的映射)

void remap(InputArray src, OutputArraydst, InputArray map1, InputArray map2, int interpolation, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar()) 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位或者浮点型图像。 第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放函数调用后的输出结果,需和源图片有一样的尺寸和类型。 第三个参数,InputArray类型的map1,它有两种可能的表示对象。 表示点(x,y)的第一个映射。 表示CV_16SC2 , CV_32FC1 或CV_32FC2类型的X值。 第四个参数,InputArray类型的map2,同样,它也有两种可能的表示对象,而且他是根据map1来确定表示那种对象。 若map1表示点(x,y)时。这个参数不代表任何值。 表示CV_16UC1 , CV_32FC1类型的Y值(第二个值)。 第五个参数,int类型的interpolation,插值方式,所以可选的插值方式如下: INTER_NEAREST - 最近邻插值 INTER_LINEAR – 双线性插值(默认值) INTER_CUBIC – 双三次样条插值(逾4×4像素邻域内的双三次插值) INTER_LANCZOS4 -Lanczos插值(逾8×8像素邻域的Lanczos插值) 第六个参数,int类型的borderMode,边界模式,有默认值BORDER_CONSTANT,表示目标图像中“离群点(outliers)”的像素值不会被此函数修改。 第七个参数,const Scalar&类型的borderValue,当有常数边界时使用的值,其有默认值Scalar( ),即默认值为0。``` ```cpp #include <iostream> #include<opencv2/opencv.hpp> #include "math.h" using namespace std; using namespace cv; Mat src, dst, map_x,map_y ;//初始化一个操作对象 int index = 0; void update_map(void); int main(int argc, char** argv) { src = imread("C:/Users/JAY/Desktop/Others/lena.jpg"); if (!src.data)//判断图片是否加载进来 { cout << "不能加载图片" << endl; return -1; } namedWindow("加载的图片", WINDOW_AUTOSIZE); imshow("加载的图片", src);//""内命名一致,才能显示在一个窗口 map_x.create(src.size(), CV_32FC1); map_y.create(src.size(), CV_32FC1); int c = 0;//手动调节(按键1、2、3、4)使其显示不同的映射图案 while (true) { c = waitKey(500); if ((char)c == 27) { break; } index = c % 4; update_map(); remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 111, 111));//线性插值 imshow("重映射图片", dst); } return 0; } void update_map(void) { 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)) { map_x.at<float>(row, col) = 2 * (col - (src.cols*0.25) + 0.5);// 映射原图像一半的像素 map_y.at<float>(row, col) = 2 * (row - (src.rows*0.25) + 0.5); } else { map_x.at<float>(row, col) = 0;//外框映射为其它纯色 map_y.at<float>(row, col) = 0; } break; case 1: map_x.at<float>(row, col) = (src.cols - col - 1); map_y.at<float>(row, col) = row; case 2: map_x.at<float>(row, col) = col; map_y.at<float>(row, col) = (src.rows - row - 1); case 3: map_x.at<float>(row, col) = (src.cols - col - 1); map_y.at<float>(row, col) = (src.rows - row - 1); } } } }
最新回复(0)