OpenCV:访问图像中的像素

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sss_369/article/details/62888416

OpenCV图像处理算子都是一个函数。

作用:
接受一个输入或多个输入,产生输出图像。
格式:

g(x)=f(h(x))//单个输入,
或
g(x)=f(h0(x),h1(x),...,hn(x))//多个输入

图像处理变换中典型的操作:点操作
点操作: 图像亮度和对比度调整。
公式:

g(x)=a*f(x)+b;
或
g(i,j)=af(i,j)+b;

参数:

参数f(x)表示源图像像素。
参数g(x) 表示输出图像像素。
参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的**对比度。**
参数b通常被称为偏置(bias),常常被用来控制图像的**亮度**

访问图像中的像素:

访问图片中的像素有很多种方式。

//三个for循环,执行运算 new_image(i,j) =a*image(i,j) + b

    for(int y = 0; y < image.rows; y++ )//行
    {
        for(int x = 0; x < image.cols; x++ )//列
        {
            for(int c = 0; c < 3; c++ )//通道
            {
new_image.at<Vec3b>(y,x)[c]=saturate_cast<uchar>(
    (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] )
                  + g_nBrightValue);
            }
        }
    }

注释:


访问图像的每一个像素:image.at<Vec3b>(y,x)[c]
其中,y 是像素所在的行, 
     x 是像素所在的列, 
     c 是R、G、B(对应0、1、2)其中之一。
因为我们的运算结果可能超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),
所以我们要用saturate_cast对结果进行转换,以确保它为有效值。
这里的a也就是对比度,一般为了观察的效果,取值为**0.0到3.0**的浮点值,但是我们的轨迹条一般取值都会整数,所以在这里我们可以,将其代表对比度值的nContrastValue参数设为0到300之间的整型,在最后的式子中乘以一个0.01,这样就可以完成轨迹条中300个不同取值的变化。所以在式子中,我们会看到saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue )中的g_nContrastValue*0.01。

示例:

// 11111111111111111.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace std;
using namespace cv;


static void ContrastAndBright(int, void *);//静态函数,不担心函数重名的问题

int g_nContrastValue; //对比度值
int g_nBrightValue;  //亮度值
Mat g_srcImage,g_dstImage;

int main(  )
{
    system("color5F");//改变控制台前景色和背景色 

    g_srcImage= imread( "1.jpg");

    if(!g_srcImage.data ) {
        printf("读取g_srcImage图片错误~!\n"); 
        return false;
    }

    g_dstImage= Mat::zeros( g_srcImage.size(), g_srcImage.type() );//定义图像变量

    //设定对比度和亮度的初值
    g_nContrastValue=80;
    g_nBrightValue=80;

    //创建窗口
    namedWindow("【效果图窗口】", 1);

    //创建轨迹条
    createTrackbar("对比度:", "【效果图窗口】",&g_nContrastValue,300,ContrastAndBright );
    createTrackbar("亮   度:","【效果图窗口】",&g_nBrightValue,200,ContrastAndBright );

    //调用回调函数
    ContrastAndBright(g_nContrastValue,0);
    ContrastAndBright(g_nBrightValue,0);

    //输出一些帮助信息
    cout<<endl<<"\t嗯。好了,请调整滚动条观察图像效果~\n\n"
            <<"\t按下“q”键时,程序退出~!\n"
            <<endl;

    //按下“q”键时,程序退出
   while(char(waitKey(1)) != 'q') {}

   return 0;
}

static void ContrastAndBright(int, void *)
{

    //创建窗口
    namedWindow("【原始图窗口】", 1);

    //三个for循环,执行运算 g_dstImage(i,j) =a*g_srcImage(i,j) + b
    for(int y = 0; y < g_srcImage.rows; y++ )
    {
        for(int x = 0; x < g_srcImage.cols; x++ )
        {
            for(int c = 0; c < 3; c++ )
            {
                //访问图像像素
                g_dstImage.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y,x)[c] ) + g_nBrightValue );
            }
        }
    }

    //显示图像
    imshow("【原始图窗口】", g_srcImage);
    imshow("【效果图窗口】", g_dstImage);
}

1
2

猜你喜欢

转载自blog.csdn.net/sss_369/article/details/62888416