1. 程式人生 > >OpenCV(C++) 基礎(五)-- 影象變換(重對映/仿射/直方圖均衡化)

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