1.像素重映射的概念
void update_map(Mat& image, int index)//变化的函数
{
Mat map_x, map_y;//map_x, map_y表示x,y的映射表
map_x.create(image.size(), CV_32FC1);
map_y.create(image.size(), CV_32FC1);
for (int row = 0; row < image.rows; row++)
{
for (int col = 0; col < image.cols; col++)
{
switch (index)
{
case 0:
if (col > (image.cols * 0, 25) && col < (image.cols * 0.75) && (row > image.rows * 0.25) &&
row < (image.rows * 0.75))//最终得到的图像大小只有原来的一半大
{
map_x.at<float>(row, col) = 2 * (col - (image.cols * 0.25) + 0.5);
map_y.at<float>(row, col) = 2 * (row - (image.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) = (image.cols - col - 1);
map_y.at<float>(row, col) = row;
break;
case 2:
//行变列不变
map_x.at<float>(row, col) = col;
map_y.at<float>(row, col) = (image.rows - row - 1);
break;
case 3:
//行列都变
map_x.at<float>(row, col) = (image.cols - col - 1);
map_y.at<float>(row, col) = (image.rows - row - 1);
default:
break;
}
}
}
}
void MyApi::pixelRemap(Mat& image)
{
int index = 0;
Mat dst, map_x, map_y;//map_x, map_y表示x,y的映射表
map_x.create(image.size(), CV_32FC1);
map_y.create(image.size(), CV_32FC1);
int c = 0;
while (true)
{
c = waitKey(500);//如果没有键盘操作就500s执行一次
index = c % 4;//index取值为0,1,2,3
if ((char)c == 27)//27表示ESC
{
break;
}
update_map(image, index);
remap(image, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 255));
imshow("重映射后的图像", dst);
}
}
按1图像左右互换,2图像上下互换,3上下左右都互换,4图像缩小一半就是index=0的情况