OpenCV(C++) 基础(五)-- 图像变换(重映射/仿射/直方图均衡化)

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值