1.重映射:翻转
void remap(src, dst, map1, map2, interpolation, mode=BORDER_CONSTANT, Scalar&borderVal=Scalar());
// map1 / map2: x / y 方向的映射矩阵
// interpolation: INTER_NEAREST / INTER_LINEAR / INTER_CUBIC...
// mode: 边界模式
// Scalar: 边界值
// case:
dst.create(src.size(), src.type());
map_x.create(src.size(), CV_32FC1);
map_y.create(src.size(), CV_32FC1);
for(int i=0; i<src.rows; i++){
for(int j=0; j<src.cols; j++){
map_x.at<float>(i, j) = static_cast<float>(j); // 列不变
map_y.at<float>(i, j) = static_cast<float>(src.rows-i); // 行翻转
}
}
remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0,0,0));
2.仿射变换:旋转/平移/缩放
void warpAffine(src, dst, M, dsize, flags=INTER_LINEAR, mode=BORDER_CONSTANT, borderVal=Scalar());
// M: 2x3的变换矩阵
// dsize:输出图像尺寸
// flags:插值方法
// mode:边界模式 borderVal:边界值
//case:
Point2f srcTriangle[3], dstTriangle[3];
Mat rotMat(2, 3, CV_32FC1), warpMat(2, 3, CV_32FC1);
Mat src, dst_warp, dst_warp_rotate;
dst_warp = Mat::zeros(src.rows, src.cols, src.type());
srcTriangle[0] = Point2f(0, 0);
srcTriangle[1] = Point2f(static_cast<float>(src.cols-1), 0);
srcTriangle[2] = Point2f(0, static_cast<float>(src.rows-1));
dstTriangle[0] = Point2f(static_cast<float>(src.cols*0.0), static_cast<float>(src.rows*0.33));
dstTriangle[1] = Point2f(static_cast<float>(src.cols*0.65), static_cast<float>(src.rows*0.35));
dstTriangle[2] = Point2f(static_cast<float>(src.cols*0.15), static_cast<float>(src.rows*0.6));
// 求得仿射变换
warpMat = getAffineTransform(srcTriangle, dstTriangle);
warpAffine(src, dst_warp, warpMat, dst_warp.size());
// 旋转
Point center = Point(dst_warp.cols/2, dst_warp.rows/2);
double angle = -30.0, scale = 0.8;
// 求得旋转矩阵
rotMat = getRotationMatrix2D(center, angle, scale);
warpAffine(dst_warp, dst_warp_rotate, rotMat, dst_warp.size());
3.直方图均衡化:增强图像对比度和表现力
void equalizeHist(src, dst);
// 彩色图像直方图均衡化
Mat equalizeIntensityHist(const Mat & inputImage){
if(inputImage.channels() >= 3) {
Mat ycrcb, result;
cvtColor(inputImage, ycrcb, COLOR_BGR2YCrCb);
vector<Mat> channels;
split(ycrcb, channels);
equalizeHist(channels[0], channels[0]);
merge(channels,ycrcb);
cvtColor(ycrcb, result, COLOR_YCrCb2BGR);
return result;
}
return Mat();
}