一,平移,先给效果,直观感受下,向右下角平移:
1. matlab代码实现:
%题目:图像平移
%公式:I = i+△i; J = j+△j。
clc;
clear;
f = rgb2gray(imread('D:\Code\Image\classic.jpg'));
figure,imshow(f);
%确定平移后画布
[row,col] = size(f);
move_i = 40;%移动垂直方向移动的行数
move_j = 80;
g = zeros(row+move_i,col+move_j);%新的画布
%移动
for i=1:row %遍历旧画布
for j=1:col
g(i+move_i,j+move_j) = f(i,j);
end
end
g = mat2gray(g);
figure,
imshow(g);
2. C++实现:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("D:/Code/Image/classic.jpg", 0);
imshow("原图",img);
int row_trans = 40;
int col_trans = 80;
Mat newImg = Mat::zeros(img.rows + row_trans, img.cols + col_trans, CV_8UC1);
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
newImg.at<uchar>(i + row_trans, j + col_trans) = img.at<uchar>(i, j);
}
}
imshow("效果图", newImg);
waitKey(0);
return 0;
}
二、镜像,水平镜像,效果图:
1. matlab代码实现:
%题目:镜像
%公式:水平镜像,I = i, J = col-j+1; 水平坐标不变,以图像垂直中轴线为轴,翻转,
%左边的翻到右边,右边翻到左边。
F = imread('D:\Code\Image\classic.jpg');
F = rgb2gray(F);
figure,imshow(F);
[row,col] = size(F);
G = zeros(row,col);
for i=1:row
for j=1:col
G(i,j) = F(i,col-j+1);%水平镜像,行i不变
end
end
figure(2);
imshow(uint8(G));
2. C++实现:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("D:/Code/Image/classic.jpg", 0);
imshow("原图", img);
Mat newImg = Mat::zeros(img.size(), img.type());
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
newImg.at<uchar>(i, j) = img.at<uchar>(i, img.cols - j + 1);
}
}
imshow("效果图", newImg);
waitKey(0);
return 0;
}
垂直镜像, 算法类似,就是列不变,关键算法:newImg.at<uchar>(i, j) = img.at<uchar>(img.rows - i + 1, j);