OpenCV(C++) 基礎(五)-- 影象變換(重對映/仿射/直方圖均衡化)
阿新 • • 發佈:2018-12-11
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(); }