最近邻插值实现:图像任意尺寸变换

#<opencv2/imgproc/imgproc.hpp>  
#include <opencv2/core/core.hpp>        
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
using namespace cv;
using namespace std;
// 实现最近邻插值图像缩放
cv::Mat nNeighbourInterpolation(cv::Mat srcImage)
{
    // 判断输入有效性
	CV_Assert(srcImage.data != NULL);
    int rows = srcImage.rows;
	int cols = srcImage.cols;
	// 构建目标图像
	cv::Mat dstImage = cv::Mat(
		cv::Size(2300, 480), srcImage.type(), 
       cv::Scalar::all(0));
	int dstRows = dstImage.rows;
	int dstCols = dstImage.cols;
	// 坐标转换 求取缩放倍数
	float cx = (float)cols / dstCols;
	float ry = (float)rows / dstRows; 
	std::cout << "cx: " << cx << "ry:" << ry << std::endl;
	// 遍历图像完成缩放操作
    for(int i = 0 ; i < dstCols; i++)
    {
    	// 取整获取目标图像在源图像对应坐标
    	int ix = cvFloor(i * cx);  
    	for(int j = 0; j < dstRows; j++)
    	{
            int jy = cvFloor(j * ry);
            // 边界处理 防止指针越界
            if(ix > cols - 1)
        		ix = cols - 1;
         	if(jy > rows - 1)
        		jy = rows - 1;
        	// 映射矩阵
           dstImage.at<cv::Vec3b>(j, i) = 
                srcImage.at<cv::Vec3b>(jy, ix);
    	}   	 
    }
    return  dstImage;
}
int main()
{
    // 图像源获取及验证
    cv::Mat srcImage = cv::imread("2.jpg");
     if( !srcImage.data ) 
	   return -1;
    // 最近邻插值缩放操作
	cv::Mat dstImage = nNeighbourInterpolation(srcImage);
    cv::imshow("srcImage", srcImage);
    cv::imshow("dstImage", dstImage);
    cv::waitKey(0);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值