【图像处理知识复习】09基于等间隔的图像缩小方法实现 Matlab,C++

% 题目:基于等间隔采样的 图像缩小方法
%已知:采样间隔,行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;
}


效果如下:


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值