%
题目:基于等间隔采样的 图像缩小方法
%已知:采样间隔,行k1, 列k2;如果k1=k2,则为等比例缩小,k1<1,k2<1。如果k1>1且k2>1,则为放大,这是是缩小。
%已知:采样间隔,行k1, 列k2;如果k1=k2,则为等比例缩小,k1<1,k2<1。如果k1>1且k2>1,则为放大,这是是缩小。
%公式:遍历完缩小后图像,g(i,j) = f(round(i*(1/k1)), round(j*(1/k2))); round(i*(1/k1))采样行坐标。f为原图像
注意:发现用round,ceil,floor都可能越界, ceil可能过大>row,floor可能过小=0,可能加判断语句解决。
效果如下:
1. Matlab代码实现:
clc;clear;
f = rgb2gray(imread('D:/Code/Image/classic.jpg'));
figure,imshow(f);
%(1)计算采样间隔
k1 = 0.7;
k2 = 0.6; %缩小的倍数。
%(2)求出缩小后图像
[row,col] = size(f);
for i=1:row*k1 %遍历新画布,将旧画布像素有选择性的填充到新画布中
for j=1:col*k2
g(i,j) = f(round(i*(1/k1)),round(j*(1/k2)));
end
end
figure,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);
// 行采样间隔k1<1,列采样k2<1,如果k1==k2,则行列等比例缩小
double k1 = 0.7;
double k2 = 0.6;
double row = img.rows;
double col = img.cols;
// 特别注意Size(width, height),等于(col, row)
Mat new_img = Mat::zeros(Size(round(col*k2), round(row*k1)), CV_8UC1); //缩小后图像大小
for (int i = 0; i < round(row * k1); i++) // row * k1 * 1/k1 == row
{
for (int j = 0; j < round(col * k2); j++)
{
new_img.at<uchar>(i, j) = img.at<uchar>(round(i * 1 / k1), round(j * 1 / k2));
}
}
imshow("缩小后图", new_img);
waitKey(0);
return 0;
}
效果如下: