设为首页 加入收藏

TOP

OpenCV操作像素深入理解(一)
2018-11-24 22:08:37 】 浏览:485
Tags:OpenCV 操作 像素 深入 理解

在了解了图像的基础知识和OpenCV的基础知识和操作以后,接下来我们要做的就对像素进行操作,我们知道了图像的本质就是一个矩阵,那么一个矩阵中存储了那么多的像素,我们如何来操作呢?下面通过几个例子来看看像素的操作。


这个是原图,接下来的例子都是对这个图片进行操作的。



我们需要有雪花的效果,这里的雪花其实就是一个个白色的点,白色在像素值是255,所以我们的思路就是在一个图像上面的矩阵中的一些像素值转成值为255的,如果是彩色的图像的话就是三个通道,那么就是分别对三个通道的值都转为255,三通道在OpenCV里面是按照蓝绿红的顺序排布的。


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <random>


// Add white noise to an image
void white(cv::Mat image, int n) {


    // C++11 random number generator
    std::default_random_engine generator;
    std::uniform_int_distribution<int> randomRow(0, image.rows - 1);
    std::uniform_int_distribution<int> randomCol(0, image.cols - 1);


    int i,j;
    for (int k=0; k<n; k++) {
        // 生成图形位置
        i= randomCol(generator);
        j= randomRow(generator);
        if (image.type() == CV_8UC1) { //灰度图像
            // 单通道8位
            image.at<uchar>(j,i)= 255;
        } else if (image.type() == CV_8UC3) { // color image
            // 3通道,分别是蓝绿红
            image.at<cv::Vec3b>(j,i)[0]= 255;
            image.at<cv::Vec3b>(j,i)[1]= 255;
            image.at<cv::Vec3b>(j,i)[2]= 255;
            // or simply:
            // image.at<cv::Vec3b>(j, i) = cv::Vec3b(255, 255, 255);
        }
    }
}


int main()
{
    // open the image
    cv::Mat image= cv::imread("boldt.jpg",1);


    // call function to add noise
    white(image,3000);


    // display result
    cv::namedWindow("Image1");
    cv::imshow("Image1",image);


    // write on disk
    cv::imwrite("salted.bmp",image);


    cv::waitKey();


    // test second version
    cv::Mat image2= cv::imread("boldt.jpg",0);//0表示灰度图


    white(image2, 500);


    cv::namedWindow("Image2");
    cv::imshow("Image2",image2);


    cv::waitKey();


    return 0;
}



彩色图像由三通道像素组成,每个通道表示红、绿、蓝三原色中一种颜色的亮度值,每个数值都是8位无符号字符类型,因此颜色总数为 256×256×256,即超过 1600 万种颜色。


所以有时候为了降低分析的复杂性,需要减少图像中颜色的数量。


一种实现方法是把RGB空间细分到大小相等的方块中。例如,如果把每种颜色数量减少到 1/8,那么颜色总数就变为 32×32×32。将旧图像中的每个颜色值划分到一个方块,该方块的中间值就是新的颜色值;新图像使用新的颜色值,颜色数就减少了。


所以在这里的减少图像中颜色的数量的思路的步骤是:


#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


void reduceColor(cv::Mat image, int div = 64)
{
    int nl = image.rows;//行数
    int nc = image.cols * image.channels();//每一行的像素数量


    for (int i = 0; i < nl; ++i) {
        //获取行i的地址
        auto data = image.ptr<uchar>(i);
        for (int j = 0; j < nc; ++j) {
            //处理每一个像素
          &n

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇OpenCV颜色转换和皮肤检测 下一篇Shell编程基础进阶

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目