点击链接→【数字图像处理】简单实践汇总
1. 打开、显示、存储图像
- imread(“图像路径”);
- imshow(“窗口名称”,图像名称);
- imwrite(“保存路径”,图像名称);
//打开图像
Mat srcImage = imread("jpg/Lena.jpg");
//显示图像
imshow("原图", srcImage);
//存储图像
imwrite("jpg/Lena_save.jpg", srcImage);
2. 缩放、降采样
-
Mat(宽,高,类别);//Mat的一种构造函数,宽即cols,高即rows,很容易搞混;
-
CV_8UC3的含义:
- 8:每个像素点在内存空间所占的空间大小8位;
- U:unsigned int,无符号整型;
- C3:带Alpha通道的RGB彩色图像,即四通道图像;
-
用deImage.at(i, j) = pixel;给像素点赋值;注意彩色的要用,黑白的用;
- pixel[0] //Blue
- pixel[1] //Green
- pixel[2] //Red
-
循环是原图每隔8个点取个像素值付给修改图,xy方向修改图的像素个数都是原图的1/8;
-
namedWindow(“新窗口名称”,窗口类型);
-
WINDOW_NORMAL:窗口可以随意拉伸;
-
resizeWindow(“修改尺寸的窗口名称”,宽,高);//这个可以不用,就是显示很小,拉大也行;
#define REDUCE_RATIO 8
//缩放图像
//定义图片的大小,然后遍历每个像素点赋值(图片的原始尺寸是256*256像素的)
Mat deImage(srcImage.cols / REDUCE_RATIO, srcImage.rows / REDUCE_RATIO, CV_8UC3);
int i = 0, j = 0;
for (int row = 0; row < srcImage.rows; row += REDUCE_RATIO)
{
for (int col = 0; col < srcImage.cols; col += REDUCE_RATIO)
{
Vec3b pixel;
pixel[0] = srcImage.at<Vec3b>(row, col)[0]; //Blue
pixel[1] = srcImage.at<Vec3b>(row, col)[1]; //Green
pixel[2] = srcImage.at<Vec3b>(row, col)[2]; //Red
deImage.at<Vec3b>(i, j) = pixel;
j++;
}
i++;
j = 0;
}
//创建一个新窗口
namedWindow("降采样", WINDOW_NORMAL);
//设置窗口的大小,不然会显示图片实际大小的窗口
resizeWindow("降采样", 256, 256);
imshow("降采样", deImage);
注意:
- 如果图片尺寸不是8的整数倍,在遍历的时候会越界;
- 不要用
resize(deImage, deImage, Size(256, 256));
平滑图像,resize会自动平滑;
3. 降灰度分辨率
#define GREY_RATIO 64
Mat greyImage(srcImage.cols, srcImage.rows, CV_8UC3);
for (int row = 0; row < srcImage.rows; row++)
{
for (int col = 0; col < srcImage.cols; col++)
{
Vec3b pixel;
pixel[0] = ((int)(srcImage.at<Vec3b>(row, col)[0]) / GREY_RATIO) * GREY_RATIO; //Blue
pixel[1] = ((int)(srcImage.at<Vec3b>(row, col)[1]) / GREY_RATIO) * GREY_RATIO; //Green
pixel[2] = ((int)(srcImage.at<Vec3b>(row, col)[2]) / GREY_RATIO) * GREY_RATIO; //Red
greyImage.at<Vec3b>(i, j) = pixel;
j++;
}
i++;
j = 0;
}
imshow("降灰度分辨率", greyImage);