在图像处理之中,需要遍历所有的像素,由于所要遍历的像素过于庞大,为了便于快速计算,便需要对图像的像素进行颜色缩减。
#include <iostream>
#include <string>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace cv;
// 读入图片
Mat readImage(String imgName);
// 显示图片
void showImage(String windowName, Mat ima);
// 椒盐函数
void salt(cv::Mat &image, int n);
// 保存图片
void saveImage(String imageName, Mat ima);
// 测试椒盐早点
void testSalt(cv::Mat &img);
// 颜色缩减函数
void colorReduce(cv::Mat &image, int div);
// 测试颜色缩减
void testColorReduce(cv::Mat &img, int reduceDiv);
void main() {
String imgName = "381066140_1536_864.jpg";
// 打开图像
Mat img = readImage(imgName);
// --- 01 ----测试椒盐噪点
// testSalt(img);
// --- 02 ----测试颜色缩减
testColorReduce(img, 64);
}
// 颜色缩减函数
void colorReduce(cv::Mat &image, int div = 64) {
//图像的行数
int nRow = image.rows;
// 每一行的像素数
int nRowCount = image.cols * image.channels();
for (int n = 0; n < nRow; n++) {
// 获取第n行的首地址
uchar* data = image.ptr<uchar>(n);
// 循环处理每一行的所有像素
for (int i = 0; i < nRowCount; i++) {
// 缩减颜色
data[i] = data[i] / div*div + div / 2;
}
}
}
// 测试颜色缩减
void testColorReduce(cv::Mat &img, int reduceDiv) {
// ----------------颜色缩减测试Start-------------------------
// 设置椒盐增加噪点
colorReduce(img, reduceDiv);
showImage("ColorReduce", img);
// 保存图片
saveImage("ColorReduce.jpg", img);
// ----------------颜色缩减测试End-------------------------
}
// 椒盐函数
void salt(cv::Mat &image, int n) {
for (int k = 0; k < n; k++) {
// 生成行列的随机数
int iCol = rand() % image.cols;
int jRow = rand() % image.rows;
// 判断是否是灰度图
if (1 == image.channels()) {
image.at<uchar>(jRow, iCol) = 255;
}
// 判断是否是彩色图像
else if (3 == image.channels()) {
image.at<cv::Vec3b>(jRow, iCol)[0] = 255;
image.at<cv::Vec3b>(jRow, iCol)[1] = 255;
image.at<cv::Vec3b>(jRow, iCol)[2] = 255;
}
}
}
void testSalt(cv::Mat &img) {
// ----------------椒盐噪点测试Start-------------------------
// 设置椒盐增加噪点
salt(img, 40000);
showImage("Salt", img);
// 保存图片
saveImage("salt.jpg", img);
// ----------------椒盐噪点测试End-------------------------
}
// 显示图片
void showImage(String windowName, Mat ima) {
imshow(windowName, ima);
waitKey(0);
}
// 读入图片
Mat readImage(String imgName) {
Mat ima = imread(imgName);
cvNamedWindow("Charater2");
imshow("C2", ima);
waitKey(0图
;
return ima;
}
// 保存图片
void saveImage(String imageName, Mat ima) {
imwrite(imageName, ima);
}
原图:
运行结果图: