OpenCV之遍历像素,减少图像颜色[模糊],测试运行时间

博客转载了2019年独角兽企业重金招聘Python工程师的标准,链接为https://my.oschina.net/u/3919756/blog/1939621 。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;
/* 名字: 颜色空间缩减函数
 * 目的:减少图像中颜色的数量
 * 方法: 比如原来有256中颜色,要将其变成64种颜色:
 * 将原来的颜色/4然后乘以4就可以了
*/

/*   方法1:用指针访问像素,release时速度最快 0.0066653 */
void colorReducePtr(Mat &inputImage, Mat& outputImage, int div)
{
    //参数准备
    outputImage = inputImage.clone();   //复制实参到临时变量
    int rowNumber = outputImage.rows; //行数
    int colNumber = outputImage.cols * outputImage.channels();  //每一行元素的个数 = 类数 * 通道数

    //双for,遍历所有像素值
    for(int i = 0; i < rowNumber; ++i)  //行
    {
        uchar *data = outputImage.ptr<uchar>(i);  //获取第i行的首地址
        for(int j = 0; j < colNumber; ++j)
        {
            data[j] = data[j]/div*div + div/2; // 处理每一个像素
            cout << data[j] << ends;
        }

    }
}

void colorReducePtr2(Mat &inputImage, Mat& outputImage, int div)
{
    //参数准备
    outputImage = inputImage.clone();   //复制实参到临时变量
    int rowNumber = outputImage.rows; //行数
    int colNumber;
    if(outputImage.isContinuous()){
        colNumber = outputImage.total() * outputImage.elemSize(); //每一行元素的个数
        rowNumber = 1;
        uchar *data = outputImage.ptr<uchar>(0);  //获取第i行的首地址
        for(int i = 0; i < colNumber; ++i){
            data[i] = data[i]/div*div + div/2;
        }

    }
}
/*   0.242588    */
void colorReduceSTL(Mat &inputImage, Mat& outputImage, int div)//迭代器方式
{
    outputImage = inputImage.clone();   //复制实参到临时变量
    Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();
    Mat_<Vec3b>::iterator itEnd = outputImage.end<Vec3b>();

    for(; it!=itEnd ; it++){
        //处理每一个像素
        (*it)[0] = (*it)[0]/div *div + div/2;
        (*it)[1] = (*it)[1]/div *div + div/2;
        (*it)[2] = (*it)[2]/div *div + div/2;
    }
}
//At方式往往只用于随机分为某个位置上的像素值
void colorReduceAt(Mat& inputImage, Mat& outputImage, int div)
{
    outputImage = inputImage.clone();
    int rows = outputImage.rows;
    int cols = outputImage.cols;
    for(int i = 0;i < rows;i++)
    {
        for(int j = 0;j < cols;j++)
        {
            outputImage.at<Vec3b>(i,j)[0] =  outputImage.at<Vec3b>(i,j)[0]/div*div + div/2;
            outputImage.at<Vec3b>(i,j)[1] =  outputImage.at<Vec3b>(i,j)[1]/div*div + div/2;
            outputImage.at<Vec3b>(i,j)[2] =  outputImage.at<Vec3b>(i,j)[2]/div*div + div/2;
        }
    }
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Mat srcImage = imread("F:\\MyCode\\dcq.jpg");
    imshow("srcImage", srcImage);

    //按照原始图的参数规格来创建效果图
    Mat dstImage ;
    dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());

    //记录起始时间
    double time0 = static_cast<double>(getTickCount());

    //调用颜色空间缩减函数
    colorReduceAt(srcImage, dstImage, 64);

    time0 = ((double)getTickCount() - time0) / getTickFrequency();
    cout << "time: " << time0 << "[s]" << endl;  //消耗的时间

     imshow("dstImage", dstImage);
    return a.exec();
}

a8305f9c5af7b595a14dfb00424a8105df1.jpg

转载于:https://my.oschina.net/u/3919756/blog/1939621

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值