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

简介: 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);

总结:

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

相关文章
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
525 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
55 4
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
4月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
4月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
130 1
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
211 1
|
5月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
6月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
86 1
|
6月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
111 0
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
78 0
下一篇
DataWorks