美文网首页
005 图像像素的算术操作

005 图像像素的算术操作

作者: 几时见得清梦 | 来源:发表于2019-07-25 07:51 被阅读0次
  • 本节内容:像素的加减乘除
  1. 两幅图像进行加减乘除时,图像类型、通道数、大小必须都一致。

C++

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

using namespace cv;
using namespace std;

int main(int artc, char** argv) {
    Mat src1 = imread("D:/vcprojects/images/LinuxLogo.jpg");
    Mat src2 = imread("D:/vcprojects/images/WindowsLogo.jpg");
    if (src1.empty() || src2.empty()) {
        printf("could not load image...\n");
        return -1;
    }
    namedWindow("input", CV_WINDOW_AUTOSIZE);
    imshow("input1", src1);
    imshow("input2", src2);
    int height = src1.rows;
    int width = src1.cols;

    int b1 = 0, g1 = 0, r1 = 0;
    int b2 = 0, g2 = 0, r2 = 0;
    int b = 0, g = 0, r = 0;
    
    //自己实现加减乘除
    Mat result = Mat::zeros(src1.size(), src1.type());
    for (int row = 0; row < height; row++) {
        for (int col = 0; col < width; col++) {
                b1 = src1.at<Vec3b>(row, col)[0];//读出来是int类型
                g1 = src1.at<Vec3b>(row, col)[1];
                r1 = src1.at<Vec3b>(row, col)[2];

                b2 = src2.at<Vec3b>(row, col)[0];
                g2 = src2.at<Vec3b>(row, col)[1];
                r2 = src2.at<Vec3b>(row, col)[2];


//saturate_cast是C++函数,功能是实现精准的数据转型操作(损失很少精度,转型必然损失精度),如int转cchar、short转long等。建议对像素值转型时使用此函数。
//为什么要对像素值转型为uchar类型:读出来的b1和b2都是int型,若相加后不转型则可能大于255、相减后不转型可能大于0。RGB的像素值范围是[0,255],不转型的话,无法用一个字节表示,会导致溢出。
//saturate_cast的作用:大于255时截断高位保留低位,认为是255;小于0时认为是0。
                result.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b1 + b2);
                result.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g1 + g2);//uchar是一个字节8位的
                result.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r1 + r2);
        }
    }
    imshow("output", result);


    //调用OpenCV的API完成加减乘除
    Mat add_result = Mat::zeros(src1.size(), src1.type()); //创建空白图像
    add(src1, src2, add_result); //add有三个参数(第一张图,第二张图,相加结果)。有时add有第四个参数,是mask。
    imshow("add_result", add_result);

    Mat sub_result = Mat::zeros(src1.size(), src1.type());
    subtract(src1, src2, sub_result);
    imshow("sub_result", sub_result);

    Mat mul_result = Mat::zeros(src1.size(), src1.type());
    multiply(src1, src2, mul_result);
    imshow("mul_result", mul_result);

    Mat div_result = Mat::zeros(src1.size(), src1.type());
    divide(src1, src2, div_result);
    imshow("div_result", div_result);
    
    waitKey(0);
    return 0;
}

Python

import cv2 as cv
import numpy as np

src1 = cv.imread("D:/vcprojects/images/LinuxLogo.jpg");
src2 = cv.imread("D:/vcprojects/images/WindowsLogo.jpg");
cv.imshow("input1", src1)
cv.imshow("input2", src2)
h, w, ch = src1.shape
print("h , w, ch", h, w, ch)

add_result = np.zeros(src1.shape, src1.dtype); # 创建全0图像,shape和data type与原图像相同
cv.add(src1, src2, add_result);
cv.imshow("add_result", add_result);

sub_result = np.zeros(src1.shape, src1.dtype);
cv.subtract(src1, src2, sub_result);
cv.imshow("sub_result", sub_result);

mul_result = np.zeros(src1.shape, src1.dtype);
cv.multiply(src1, src2, mul_result);
cv.imshow("mul_result", mul_result);

div_result = np.zeros(src1.shape, src1.dtype);
cv.divide(src1, src2, div_result);
cv.imshow("div_result", div_result);

cv.waitKey(0)
cv.destroyAllWindows()

相关文章

  • 005 图像像素的算术操作

    本节内容:像素的加减乘除 两幅图像进行加减乘除时,图像类型、通道数、大小必须都一致。 C++ Python

  • 计算机视觉 OpenCV Android | Mat像素操作

    本文目录 1. 像素读写2. 图像通道与均值方差计算3. 算术操作与调整图像的亮度和对比度4. 基于权重的图像叠加...

  • 图像处理

    第三章 图像处理 1.点操作 输出图像的像素值仅仅由输入图像的像素值决定。 1.1 像素变换 ...

  • 图像操作(像素)

    知识点 获取像素点:Mat.at(row,col) --三通道//获取像素点列表由bgr三个元素组成...

  • 小强学Python+OpenCV之-1.2图像基础

    目标 学完本节,我们将理解: 图像的基本元素是像素,什么是像素。 图像的坐标系统是怎样的。 操作像素的RGB值 通...

  • 1.6 openCV-python 图像的基础操作

    图像的基础操作 获取像素值并修改 获取图像的属性 图像的ROI() 图像通道的拆分与合并

  • 第二章 图像的点运算

    图像的点运算主要用于改变一副图像的灰度分布范围。操作对象是单个像素值,输出像素值只与输入像素值有关。 灰度直方图 ...

  • 着色器图像处理(亮度/对比度/反像)

    基于固定基图像的图像混合操作:针对图像各像素与常量值之间的混合操作 图像的基本属性。首先是亮度,也称灰度,它是大 ...

  • 图像像素操作中X/Y & rows/cols

    图像操作中经常需要遍历像素点以及再图像指定位置进行操作的需求,那就涉及到像素点的下标索引,横纵坐标以及宽高经常出错...

  • Opencv-Python学习笔记九——图像阈值threshol

    图像阈值操作 图像阈值操作目的是从灰度图像中分离出目标区域和背景区域 图像的二值化就是将图像上的像素点的灰度值设置...

网友评论

      本文标题:005 图像像素的算术操作

      本文链接:https://www.haomeiwen.com/subject/sitcrctx.html