OpenCV中图像算术操作与逻辑操作

OpenCV中图像算术操作与逻辑操作

在图像处理中有两类最重要的基础操作分别是图像点操作与块操作,简单点说图像点操作就是图像每个像素点的相关逻辑与几何运算、块操作最常见就是基于卷积算子的各种操作、实现各种不同的功能。今天小编就跟大家一起学习OpenCV中图像点操作相关的函数与应用场景。常见算术运算包括加、减、乘、除,逻辑运算包括与、或、非、异或。准备工作:

选择两张大小一致的图像如下、加载成功以后显示如下:

加法操作结果如下:

减法操作结果如下:

乘法操作结果如下:

除法操作结果如下:

权重加法操作结果如下:

异或与非操作结果如下:

代码如下:

Mat src1, src2, dst;
    src1 = imread("D:/vcprojects/images/test1.png");
    src2 = imread("D:/vcprojects/images/moon.png");

    const char* input_title1 = "input image - 1";
    const char* input_title2 = "input image - 2";

    namedWindow(input_title1, CV_WINDOW_AUTOSIZE);
    namedWindow(input_title2, CV_WINDOW_AUTOSIZE);

    imshow(input_title1, src1);
    imshow(input_title2, src2);

    // create result windows and background image
    const char* output_title = "result image";
    namedWindow(output_title, CV_WINDOW_AUTOSIZE);
    Mat bgImg = Mat(src1.size(), src1.type());
    Mat whiteImg = Mat(src1.size(), src1.type());
    whiteImg = Scalar(255, 255, 255);

    // 临时图像
    Mat skel(src1.size(), CV_8UC1, Scalar(0));
    Mat temp(src1.size(), CV_8UC1);
    Mat element = getStructuringElement(MORPH_CROSS, Size(3, 3), Point(-1, -1));
    bool done = false;
    int index = 9, c;
    while (true) {
        switch (index) {
        case 1:
            // 加操作
            add(src1, src2, dst, Mat(), -1);
            imshow(output_title, dst);
            break;
        case 2:
            // 减操作
            subtract(src1, src2, dst, Mat(), -1);
            imshow(output_title, dst);
            break;
        case 3:
            // 乘操作
            bgImg = Scalar(2, 2, 2);
            multiply(src1, bgImg, dst, 1.0, -1);
            imshow(output_title, dst);
            break;
        case 4:
            // 除操作
            bgImg = Scalar(2, 2, 2);
            divide(src1, bgImg, dst, 1.0, -1);
            imshow(output_title, dst);
            break;
        case 5:
            // 基于权重加法 - 调节亮度
            addWeighted(src1, 1.5, src2, 0.5, 0, dst, -1);
            imshow(output_title, dst);
            break;
        case 6:
            // 逻辑非
            bitwise_not(src1, dst, Mat());
            imshow(output_title, dst);
            break;
        case 7:
            subtract(whiteImg, src1, dst, Mat(), -1);
            imshow(output_title, dst);
            break;
        case 8:
            // 逻辑异或
            bgImg = Scalar(255, 255, 255);
            bitwise_xor(src1, bgImg, dst, Mat());
            imshow(output_title, dst);
            break;
        default:
            imshow(output_title, src2);
            break;
        }

        c = waitKey(500);
        if ((char)c == 27) {
            break;
        }
        if(c > 0) {
            index = c % 9;
        }
    }

此外我们还可以基于逻辑操作与形态学的腐蚀操作实现二值图像的骨架提取,Demo演示结果如下:

代码实现如下:

    // 提取骨架
    // 转灰度与二值化
    cvtColor(src1, src1, COLOR_BGR2GRAY);
    threshold(src1, dst, 127, 255, CV_THRESH_BINARY);
    //bitwise_not(src1, src1);

    do {
        // 开操作 - 确保去掉小的干扰块
        morphologyEx(src1, temp, MORPH_OPEN, element);
        // 取反操作
        bitwise_not(temp, temp);
        // 得到与源图像不同
        bitwise_and(src1, temp, temp);
        // 使用它提取骨架、得到是仅仅比源图像小一个像素
        bitwise_or(skel, temp, skel);
        // 每次循环腐蚀,通过不断腐蚀的方式得到框架
        erode(src1, src1, element);

        // 对腐蚀之后的图像寻找最大值,如果被完全腐蚀则说明
        // 只剩下背景黑色、已经得到骨架,退出循环
        double max;
        minMaxLoc(src1, 0, &max);
        done = (0 == max);

    } while (!done);

    // 显示骨架
    imshow(output_title, skel);

总结:

通过上述代码演示,可以发现简单的图像算术运算也可以发挥大作用,基于黑色背景图像与原图权重叠加可以实现图像亮度调整、基于乘法可以实现对比度调整。基于逻辑操作与腐蚀操作可以实现二值图像的骨架提取。

时间: 2024-08-09 02:07:05

OpenCV中图像算术操作与逻辑操作的相关文章

OpenCV中图像的结构和区别

在OpenCV中,现在有很多种结构类型可以用来表示图像,它们之间有区别又有联系,现在记录一下它们之间的区别和相似之处,以便后面查看. 其中类型有: 1. Iplimage,2. Mat,3.CvMat, 4.CVArr: 其中: 1. IplImage: 较老版本的图像存储类型,在2.0之前使用: 2. CvArr: 也是较老的一种存储结构,是一种抽象的基类. 3. CvMat: 矩阵结构. 4. Mat:  新版本中使用的,推荐使用,是一个图像容器,基本上讲 Mat 是一个类,由两个数据部分组

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

部分 V图像特征提取与描述 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相信你们大多数人都玩过拼图游戏吧.首先你们拿到一张图片的一堆碎片,要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像.问题是,你怎样做到的呢?如果把你做游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了.如果计算机可以玩拼图,我们就可以给计算机一大堆自然图片,然后就可以让计算机把它拼成一张大图了.如果计算机可以自动拼接自然图片,那我们是不是可

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

部分 V图像特征提取与描述 34 角点检测的 FAST 算法 目标 ? 理解 FAST 算法的基础 ? 使用 OpenCV 中的 FAST 算法相关函数进行角点检测原理 我们前面学习了几个特征检测器,它们大多数效果都很好.但是从实时处理的角度来看,这些算法都不够快.一个最好例子就是 SLAM(同步定位与地图构建),移动机器人,它们的计算资源非常有限.为了解决这个问题,Edward_Rosten 和 Tom_Drummond 在 2006 年提出里 FAST 算法.我们下面将会对此算法进行一个简单

OpenCV中图像的读取,显示与保存

图像的读取,显示与保存 相关函数:cv2.imread().cv2.imshow().cv2.imwrite() 1.读入图像: 用cv2.imread()函数来读取图像,cv2.imread(路径,图像颜色空间)(其中颜色空间默认为BGR彩图)     cv2.IMREAD_COLOR:读入一副彩色图像 cv2.IMREAD_GRAYSCALE:以灰度模式读入图像 cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道 示例代码 import cv2 img

opencv 中x,y,height, width,rows,cols 的关系

opencv中图像的x,y 坐标以及 height, width,rows,cols 他们的关系经常混淆. rows 其实就是行,一行一行也就是y 啦.height高度也就是y啦. cols  也就是列,一列一列也就是x啦.width宽度也就是x啦. 备忘一下.

opencv中的meanshift图像切割

Meanshift(均值漂移)是一种在一组数据的密度分布中寻找局部极值的稳定的方法.Meanshift不仅能够用于图像滤波,视频跟踪,还能够用于图像切割. 通过给出一组多维数据点,其维数是(x,y,r,g,b),均值漂移能够用一个窗体扫描空间来找到数据密度最大的区域,能够理解为数据分布最集中的区域. 在这里须要注意,因为空间位置(也就是上面的x和y)的变化范围与颜色的变化范围(上面的r,g,b)有极大的不同,所以,meanshift对这两个维数要採用不同的窗体半径.在opencv自带的means

利用FreeImage将gif图像转为opencv中的Mat

网上有将gif转为iplimg的版本,只是用惯了C++的接口,所以就写了个转Mat的版本,代码比较简单 一.读文件 1 int MatFun::gif2Mat(char* data, size_t dataSize, vector<Mat>& gifImgs, Mat& singleImg) 2 { 3 /* initialise 4 ->open memory 5 ->getImageType 6 ->load bitmaps 7 ->bitmaps

OpenCV中Mat,图像二维指针和CxImage类的转换

在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应关系. 一.OpenCV的Mat类到图像二值指针的转换 以下为函数代码: unsigned char** MatTopImgData(Mat img) { //获取图像参数 int row = img.rows; int col = img.cols; int band = img.c