Opencv C++ 图像像素操作

对进行图像操作可以调整图像的亮度和对比度

对比度调整的理论:

g(x,y)=alpha*f(x,y)+beta

图像灰度值反转理论:

S=L-1-r

图像线性混合操作:

g(x,y)=(1-α)*f(x,y)+α*t(x)

· · · · · · · · 其中α的取值范围为0~1之间

在执行像素操作之前,我们需要读取图像的宽、高、通道数;

获取图像的宽:image.cols

获取图像的高:image.rows

获取图像的通道数:image.channels()

image.at<uchar>(x,y)读取单通道图像的像素值

float alpha=1.2;
float beta=30;   
 for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            int pixel = src.at<uchar>(row, col);
            //亮度和对比度调整
            dst.at<uchar>(row,col)=alpha*pixel+beta;
            //像素反转操作
            dst.at<uchar>(row, col) = 255 - pixel;
           
        }
    }

image.at<Vec3b>(x,y)[i]读取三通道图像的像素值

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
                int src_bule_pixel = src.at<Vec3b>(row, col)[0];
                int src_gule_pixel = src.at<Vec3b>(row, col)[1];
                int src_red_pixel = src.at<Vec3b>(row, col)[2];
                //亮度和对比度调整
                dst.at<Vec3b>(row,col)[0]=alpha*src_blue_pixel+beta;
                dst.at<Vec3b>(row,col)[1]=alpha*src_gule_pixel+beta;
                dst.at<Vec3b>(row,col)[2]=alpha*src_red_pixel+beta;
                //像素反转操作
                dst.at<Vec3b>(row, col)[0] = 255 - src_bule_pixel;
                dst.at<Vec3b>(row, col)[1] = 255 - src_gule_pixel;
                dst.at<Vec3b>(row, col)[2] = 255 - src_red_pixel;
        }
    }

图像混合:利用相关API“addWeighted(src1,alpha,src2,(1-alpha),gamma,dst,dtype=-1)”

注意:两张图像的大小和类型必须一致才可以进行图像混合

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;

int main(int agrc,char*agrv)
{
Mat src1,src2,dst;
src1=imread("读取一张图像");
src2=imread("读取一张图像");
if(src1.empty()||src2.empty())
{
std::cout<<"could not load image!"<<std::endl;
return -1;
}
if(src1.rows==src2.rows&&src1.cols==src2.cols&&src1.channels()==src2.channels())
{
std::cout<<"Two images are not matched!"<<std::endl;
}
float alpha=0.5;
addWeighted(src1,alpha,src2,(1-alpha),dst,0.0,-1);
nameWindow("Output Window",CV_WINDOW_AUTOSIZE);
imshow("Output Window",dst);
waitkey(0);
return 0;
}

获取浮点类型(Vec3f)三通道像素值

Vec3f pixel=image.at<Vec3f>(x,y);
float bule=pixel.val[0];
float gule=pixel.val[1];
float red=pixel.val[2];

图像类型转换

使用image.converTo(dst,type)对图像进行类型转换

CV_8UC1为单通道uchar类型

CV32F1 为单通道float类型

确保值大小范围在0~255之间的API

saturate_cast<uchar>(value)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我就是不按套路出牌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值