索引地址:系列索引
基本的像素操作介绍完毕之后,我们来看一下图像插值,即在图像某一点的周围通过算法获取一个新的像素点数据插入,实现扩展图片的尺寸:
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> 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(150, 150), 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 = floor(i * cx); for (int j = 0; j < dstRows; j++) { int jy = floor(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("lena.jpg"); if (!srcImage.data) return -1; cv::Mat dstImage = nNeighbourInterpolation(srcImage); cv::imshow("srcImage", srcImage); cv::imshow("dstImage", dstImage); cv::waitKey(0); return 0; }
|
floor,指地板。floor函数,其功能是“向下取整”,或者说“向下舍入”、“向零取舍”,即取不大于x的最大整数,与“四舍五入”不同,下取整是直接取按照数轴上最接近要求值的左边值,即不大于要求值的最大的那个整数值。
测试结果: