opencv实战从0到N (3)—— 图像运算,像素操作与对比度变换

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

opencv实战从0到N (3)—— 图像运算,像素操作与对比度变换

1,OpenCV 中提供了如下的一些函数,用来进行图像的加减乘除。

void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1);

void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1);

void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1);

void divide(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1);

void divide(double scale, InputArray src2, OutputArray dst, int dtype=-1);

void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

与此类似的还有位运算函数:

void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());

void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());

void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());

void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray());

比较常用的运算是求两幅图像像素的差的绝对值。

void absdiff(InputArray src1, InputArray src2, OutputArray dst);

还有些函数是对单幅图像进行操作的,比如对每个像素的值取平方、平方根、对数等。

void sqrt(InputArray src, OutputArray dst);

void pow(InputArray src, double power, OutputArray dst);

void exp(InputArray src, OutputArray dst);

void log(InputArray src, OutputArray dst);

2,图像像素操作:


int height = src.rows; // 图像高度

int width = src.cols; // 图像宽度(像素为单位)

int step = src.step; // 相邻行的同列点之间的字节数

int channels = src.channels(); // 颜色通道数目 (1,2,3,4)

uchar *data = (uchar *)src.data;



for (int i = 0; i != height; ++i)

    {

        for (int j = 0; j != width; ++j)

        {
    
            for (int k = 0; k != channels; ++k)

            {


                data[i*step + j*channels + k] = 255;


            }

        }

}

或者:

for (int i = 0;i < src.rows;i++)

{

    uchar* current_src = src.ptr< uchar>(i);

    uchar* current_dst = dst.ptr< uchar>(i);

    for (int j = 0;j < src.cols;j++)

    {


        if (current_src[j]==0)

        {

        current_dst[j] = 255;

        }


    }

}





3,图像改变亮度,对比度的常用方法:直方图均衡化,指数变换,对数变换。

下面给出指数变换的实例:


int gammm(Mat& src,double g, Mat& dst)

{

    Mat table,d;

    for (int i = 0;i < 256;i++)

    {

        table.push_back((int)(255*pow(i / 255.0, g)));

        //cout << (int)(255 * pow(i / 255.0, g)) << " ,";

     }

        LUT(src,table,d); //查表

        d.convertTo(dst,CV_8U);

    return 0;

}

gammm(img, 0.5, dst);

更多内容关注微信公众号:ML_Study

猜你喜欢

转载自blog.csdn.net/qq_34106574/article/details/93769633