opencv图像存储之颜色缩减

在图像处理之中,需要遍历所有的像素,由于所要遍历的像素过于庞大,为了便于快速计算,便需要对图像的像素进行颜色缩减。

#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);
}

原图:
这里写图片描述

运行结果图:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值