opencv之图像操作

 

1、图像操作

①读取图像
②像素操作

Vec3b对应三通道的顺序是blue、green、red的uchar类型数据

所涉及函数:
cvtColor():函数是一个颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间转换。也可以转换为灰度图。
bitwise_not(src,dst):是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1。

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    Mat src = imread("1.jpg");
    if(src.empty()){
        cout<<"could not load image"<<endl;
        return -1;
    }
    namedWindow("srcImage",CV_WINDOW_AUTOSIZE);
    imshow("srcImage",src);

    Mat gray_src;
    cvtColor(src,gray_src,CV_BGR2GRAY);//转换为灰度图像
    imshow("grayImage",gray_src);
    int width = gray_src.cols;
    int height = gray_src.rows;
    //单通道
    for(int row = 0;row < height;row++)
    {
        for(int col = 0; col < width;col++)
        {
            int gray = gray_src.at<uchar>(row,col);
            gray_src.at<uchar>(row,col) = 255 - gray;
        }
    }
    imshow("invertImage",gray_src);

    Mat dst;
    dst.create(src.size(),src.type());
    width = src.cols;
    height = src.rows;
    int channel = src.channels();
    //等同于bitwise_not(src,dst);
    for(int row = 0;row < height;row++)
    {
        for(int col = 0; col < width;col++)
        {
            int b = src.at<Vec3b>(row,col)[0];
            int g = src.at<Vec3b>(row,col)[1];
            int r = src.at<Vec3b>(row,col)[2];
            dst.at<Vec3b>(row,col)[0] = 255 -b;
            dst.at<Vec3b>(row,col)[1] = 255 -g;
            dst.at<Vec3b>(row,col)[2] = 255 -r;
        }
    }
    imshow("invertImageBGR",dst);
    
    waitKey(0);
    return 0;
}

2、图像混合

①线性混合操作:

g(x)=(1-\alpha)f_0(x)+\alpha f_1(x)
相关API:
addWeighted()
 

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    
    Mat src1,src2,dst;
    src1 = imread("mogu.jpg");
    src2 = imread("rain.jpg");
    if(src1.empty()||src2.empty())
    {
        cout<<"could not load image"<<endl;
        return -1;
    }
    double alpha = 0.5;
    if(src1.rows==src2.rows && src1.cols==src2.cols && src1.type()==src2.type()){
        addWeighted(src1, alpha, src2, 1.0-alpha, 0.0, dst);
        imshow("blend image",dst);
    }
    else
    {
        cout<<"could not blend images,the size of images is not same"<<endl;
        return -1;
    }
    
    waitKey(0);
    return 0;
}

3、调整图像对比度与亮度

图像变换可以分为:①像素变换--点操作②邻域操作--区域。调整图像亮度与对比度属于点操作。

g(i,j)=af(i,j)+b 

参数a:增益,控制图像的对比度;
参数b:偏置,控制图像亮度。


//-----------------------------------【头文件包含部分】---------------------------------------
//	描述:包含程序所依赖的头文件
//---------------------------------------------------------------------------------------------- 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
//#include <opencv2/opencv.hpp>
#include <iostream>

//-----------------------------------【命名空间声明部分】---------------------------------------
//	描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------   
using namespace std;
using namespace cv;


//-----------------------------------【全局函数声明部分】--------------------------------------
//	描述:全局函数声明
//-----------------------------------------------------------------------------------------------
static void ContrastAndBright(int, void *);


//-----------------------------------【全局变量声明部分】--------------------------------------
//	描述:全局变量声明
//-----------------------------------------------------------------------------------------------
int g_nContrastValue; //对比度值
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值