图像翻转
图像翻转:通过改变像素位置来实现的镜像变换
- 水平翻转:公式如下
dst(x, y) = src(cols - x - 1, y),cols为矩阵的列数 - 垂直翻转:公式如下
dst(x, y) = src(x, rows - y - 1),rows为矩阵的行数 - 水平翻转和垂直翻转同时:公式如下所示:
dst(x, y) = src(cols - x - 1, rows - y - 1) - 图像翻转示例程序如下所示:
cv::Mat image = cv::imread("test.png");
if (image.empty()) {
std::cout << "无法加载图像!" << std::endl;
return;
}
cv::Mat flip_horizontal, flip_vertical, flip_both;
// 水平翻转 (绕y轴)
// flipCode = 0: 垂直翻转
// flipCode = 1: 水平翻转
// flipCode = -1: 同时翻转
cv::flip(image, flip_horizontal, 1);
cv::flip(image, flip_vertical, 0);
cv::flip(image, flip_both, -1);
// 显示结果
cv::imshow("原图", image);
cv::imshow("水平翻转", flip_horizontal);
cv::imshow("垂直翻转", flip_vertical);
cv::imshow("同时翻转", flip_both);
cv::waitKey(0);
- 图像翻转手动实现示例如下所示:
cv::Mat image = cv::imread("test.png");
if (image.empty()) return;
// 手动实现水平翻转
cv::Mat manual_horizontal(image.size(), image.type());
for (int y = 0; y < image.rows; y++) {
for (int x = 0; x < image.cols; x++) {
// 水平翻转:x_new = cols - x - 1
int new_x = image.cols - x - 1;
manual_horizontal.at<cv::Vec3b>(y, new_x) = image.at<cv::Vec3b>(y, x);
}
}
cv::imshow("原图", image);
cv::imshow("手动水平翻转", manual_horizontal);
图像旋转
- 图像旋转:应用二维旋转的仿射变换矩阵对原图片表示的矩阵进行操作。(仿射变换就是线性变换和平移的组合)关于这个仿射变换矩阵的推导不列
- 示例程序如下所示:
cv::Mat image = cv::imread("test.png");
if (image.empty()) return;
// 获取图像中心
cv::Point2f center(image.cols / 2.0f, image.rows / 2.0f);
// 测试不同角度
std::vector<double> angles = { 30, 45, 60, 90, 120 };
for (double angle : angles) {
// 计算旋转矩阵,1.0表示不缩放
cv::Mat rotation_matrix = cv::getRotationMatrix2D(center, angle, 1.0);
// 计算旋转后的图像边界(宽和高)
double radians = angle * CV_PI / 180.0;
double sin_val = std::abs(std::sin(radians));
double cos_val = std::abs(std::cos(radians));
int new_width = int(image.rows * sin_val + image.cols * cos_val);
int new_height = int(image.rows * cos_val + image.cols * sin_val);
// 调整矩阵中的平移分量
rotation_matrix.at<double>(0, 2) += (new_width - image.cols) / 2.0;
rotation_matrix.at<double>(1, 2) += (new_height - image.rows) / 2.0;
// 应用旋转
cv::Mat rotated;
cv::warpAffine(image, rotated, rotation_matrix, cv::Size(new_width, new_height));
std::string title = "旋转 " + std::to_string((int)angle) + "°";
cv::imshow(title, rotated);
}
cv::imshow("原图", image);
cv::waitKey(0);
浙公网安备 33010602011771号