在用c++代碼復現matlab代碼時,遇到兩者resize函數的結果不相同的問題。
opencv:
resize(image1, reTmp, Size(50, 50), 0, 0, cv::INTER_LINEAR);
matlab:
tmp=imresize(img,[50 50],'bilinear','AntiAliasing',false);
以一張500×396的彩色圖片為例,resize到(50,50):
matlab imresize代碼:
img=imread('image/cluo.jpg'); img=single(img); for i=1:10 fprintf('%.6f ',img(1,i,1)); end fprintf('\n'); tmp=imresize(img,[50 50],'bilinear','AntiAliasing',false); for i=1:10 fprintf('%.6f ',tmp(1,i,1)); end
c++ resize代碼:
#include <opencv2\opencv.hpp> #include <iostream> using namespace cv; using namespace std; void main() { Mat image = imread("cluo.jpg");
Mat image1(image.rows, image.cols, CV_32FC3); for (int i = 0; i < image.rows; i++) for (int j = 0; j < image.cols; j++) { image1.at<Vec3f>(i, j)[2] = image.at<Vec3b>(i, j)[0]; image1.at<Vec3f>(i, j)[1] = image.at<Vec3b>(i, j)[1]; image1.at<Vec3f>(i, j)[0] = image.at<Vec3b>(i, j)[2]; } //打印輸出resize前r通道前10個像素點的坐標 for (int i = 0; i < 10; i++) printf("%.6f ", image1.at<Vec3f>(0, i)[0]); printf("\n"); Mat reTmp; resize(image1, reTmp, Size(50, 50), 0, 0, cv::INTER_LINEAR); //resize(image1, reTmp, Size(50, 50), 0, 0, cv::INTER_NEAREST); //打印輸出resize后r通道前10個像素點的坐標 for (int i = 0; i < 10; i++) printf("%f ", reTmp.at<Vec3f>(0, i)[0]); printf("\n"); system("pause"); }
結果比較:
結果基本相同
matlab中默認的 tmp=imresize(img,[50 50],'bilinear'); 函數是打開了抗鋸齒 結果和opencv中的INTER_LINEAR不相同
matlab 和 opencv中 nearest 方式的結果比較:
c++: resize(image1, reTmp, Size(50, 50), 0, 0, cv::INTER_NEAREST);
matlab: tmp=imresize(img,[50 50],'nearest');
matlab: tmp=imresize(img,[50 50],'nearest','AntiAliasing',false);
結果不相同