当前位置: 首页 > news >正文

【P38 6】OpenCV Python——图片的运算(算术运算、逻辑运算)加法add、subtract减法、乘法multiply、除法divide

  • 1 加法运算
    • 1.1 加法运算示例add
    • 1.2 cv2.add() 和直接相加 对比
  • 2 减法
  • 3 乘法multiply,除法divide
    • 3.1 乘法运算(亮度增强)
    • 3.2. 基础除法运算 (需添加常量防除零)
    • 3.3. 标准化除法改进 (更可视化的结果)
    • 3.4. 通道加权乘法(矩阵元素级)
    • 3.5 除法再探究

在这里插入图片描述

1 加法运算

1.1 加法运算示例add

import cv2
import numpy as npdog=cv2.imread('dog.jpeg')h=dog.shape[0]//2#//取整除法
w=dog.shape[1]//2#尺寸太大了,不便展示
dog = cv2.resize(dog, (w,h), interpolation = cv2.INTER_CUBIC)
#dog=dog.resize((200,200))#不知为啥,这个resize是错的,运行一闪而过
print(dog.shape)
cv2.imshow("dog",dog)img=np.full((h,w,3),50,np.uint8)#生成每个像素的RGB值都是(50,50,50)的灰色图像
result=cv2.add(dog,img)#直接相加,效果不好
dog2=dog+img#显示
cv2.imshow("img",img)
cv2.imshow("result",result)
cv2.imshow("dog2",dog2)#直接相加,效果不好key=cv2.waitKey(0)

在这里插入图片描述

add函数相加(饱和运算):效果(左)
直接相加(模运算),效果不好(右)

在这里插入图片描述

1.2 cv2.add() 和直接相加 对比

在OpenCV中,cv2.add() 和直接相加 (+) 是两种不同的图像像素值相加方式,主要区别在于数值处理机制:

‌ 1 cv2.add() 函数‌:

  • 饱和运算(Saturation Arithmetic):
    • 计算结果超过255时自动截断为255;
    • 例:200 + 100 = 255;
  • 保证结果始终在0-255范围内;
  • 适合图像混合/叠加操作;
    2‌ 直接相加 (+)‌:
  • 模运算(Modulo Arithmetic):
    • 计算结果超过255时会取模(256取余);
    • 例:200 + 100 = 300 % 256 = 44;
  • 产生非预期的颜色循环效果;
  • 通常需要手动处理溢出(如 np.clip(dog+img, 0, 255));

在这里插入图片描述

2 减法

在这里插入图片描述

img=np.full((h,w,3),50,np.uint8)
add_img=cv2.add(dog,img)#加
subtract_img=cv2.subtract(dog,img)#减#显示
cv2.imshow("img",img)
cv2.imshow("add_img",add_img)
cv2.imshow("subtract_img",subtract_img)

原图
在这里插入图片描述

左加,右减;

结论:
加运算,图片更亮;
减运算,图片更暗;

在这里插入图片描述

完整代码

import cv2
import numpy as npdog=cv2.imread('dog.jpeg')h=dog.shape[0]//2#//取整除法
w=dog.shape[1]//2#尺寸太大了,不便展示
dog = cv2.resize(dog, (w,h), interpolation = cv2.INTER_CUBIC)
#dog=dog.resize((200,200))#不知为啥,这个resize是错的,运行一闪而过
print(dog.shape)
cv2.imshow("dog",dog)img=np.full((h,w,3),50,np.uint8)
add_img=cv2.add(dog,img)#加
subtract_img=cv2.subtract(dog,img)#减#显示
cv2.imshow("img",img)
cv2.imshow("add_img",add_img)
cv2.imshow("subtract_img",subtract_img)key=cv2.waitKey(0)

3 乘法multiply,除法divide

在这里插入图片描述

import cv2
import numpy as npdog=cv2.imread('dog.jpeg')h=dog.shape[0]//2#//取整除法
w=dog.shape[1]//2#尺寸太大了,不便展示
dog = cv2.resize(dog, (w,h), interpolation = cv2.INTER_CUBIC)
#dog=dog.resize((200,200))#不知为啥,这个resize是错的,运行一闪而过
print(dog.shape)
cv2.imshow("dog",dog)img=np.full((h,w,3),50,np.uint8)#生成每个像素的RGB值都是(50,50,50)的灰色图像#乘法运算(亮度增强效果)
mult_img = cv2.multiply(dog, 1.5) # 1.5倍亮度提升 
cv2.imshow("Multiplication", mult_img)# 除法运算(需添加微小常量防除零)
divide51_img = cv2.divide(dog, img + 1) # 避免除数为0 
cv2.imshow("Division/51", divide51_img)#标准化除法(更可视化的结果)
normalized_div = cv2.divide(dog, img + 1, scale=100) # 缩放结果 
cv2.imshow("Normalized Division", normalized_div)#加权乘法(矩阵元素级)
matrix_mult = cv2.multiply(dog, np.array([0.8, 1.2, 0.9], dtype=np.float32)) 
cv2.imshow("Channel Weighted Multiply", matrix_mult)key=cv2.waitKey(0)

下面是对上面代码关键部分的解释

3.1 乘法运算(亮度增强)

mult_img = cv2.multiply(dog, 1.5)  # 1.5倍亮度提升
  • 原理‌: 对每个像素的BGR通道值执行标量乘法
  • 运算规则‌:
    • 采用饱和运算:结果 = min(原始值 × 1.5, 255);
    • 例如:原像素值100 → 100×1.5=150(正常显示);
    • 原像素值200 → 200×1.5=300 → 截断为255;
  • 效果‌: 整体亮度提升,高光区域可能出现过曝;
    在这里插入图片描述

3.2. 基础除法运算 (需添加常量防除零)

divide_img = cv2.divide(dog, img + 1)  # img是50的灰度图
  • 运算过程‌:
    • 除数: img + 1 = 51(所有像素值);
    • 计算公式: 结果 = dog / 51;
    • 典型计算: 原像素值100 → 100/51≈1.96 → 转换为uint8后=1(几乎全黑);
  • ‌全黑原因‌:
    • 原始图像像素值范围(0-255)除以51后结果范围(0-5);
    • 转换为uint8类型时,小于1的值显示为0(纯黑);

在这里插入图片描述

3.3. 标准化除法改进 (更可视化的结果)

将除法的结果 再乘以 scale 倍率。

normalized_div = cv2.divide(dog, img + 1, scale=100)

改进原理‌:

  • scale参数作为乘数:结果 = 100 × (dog/51)
  • 使输出值范围扩大到0-500,但:
    • 仍会被截断到255(uint8限制)
    • 实际效果:100/51×100≈196(可见灰度)

在这里插入图片描述

3.4. 通道加权乘法(矩阵元素级)

通道加权乘法: 每个通道乘以不同的系数;

matrix_mult = cv2.multiply(dog, [0.8,1.2,0.9])

‌特殊效果‌:

  • B通道×0.8(削弱蓝色)
  • G通道×1.2(增强绿色)
  • R通道×0.9(轻微削弱红色)

‌应用场景‌: 色彩平衡调整;

在这里插入图片描述

3.5 除法再探究

下面两种代码,都是每个通道除以5的意思,结果一样

divide_45_img = cv2.divide(dog, img - 45) 
cv2.imshow("Division-45", divide_45_img)
divide5_img = cv2.divide(dog, 5) 
cv2.imshow("Division/5", divide5_img)

在这里插入图片描述

http://www.lryc.cn/news/624755.html

相关文章:

  • Maven resources资源配置详解
  • 深度研究系统、方法与应用的综述
  • kubeadm方式部署k8s集群
  • zsh 使用笔记 命令行智能提示 bash智能
  • 视频因为264问题无法网页播放,解决方案之一:转化视频
  • 【matlab】考虑源荷不平衡的微电网鲁棒定价研究
  • 第7节 神经网络
  • grep命令要点、详解和示例
  • 淘宝扭蛋机小程序开发:引领电商娱乐化新潮流
  • 剧本杀小程序系统开发:保障游戏公平,营造健康娱乐环境
  • 香港数据合集:建筑物、手机基站、POI、职住数据、用地类型
  • 27.Linux 使用yum安装lamp,部署wordpress
  • 【CV 目标检测】Fast RCNN模型③——模型训练/预测
  • 短剧小程序系统开发:推动短剧行业规范化与标准化发展
  • 移动端PFD预览组件Vue3(非插件)
  • Nacos-6--Naco的QUIC协议实现高可用的工作原理
  • Linux系统启动原理及故障排除
  • GitHub Actions 从核心思想到最佳实践
  • Go语言基础结构全解析
  • 海洋牧场:奏响乡村振兴的蓝色乐章
  • Mysql——前模糊索引失效原因及解决方式
  • Linux软件编程(七)线程间同步与进程间通信
  • Tomcat Wrapper源码解析:深入理解Servlet生命周期与请求分发机制
  • 【81页PPT】国内某知名大型制药企业制药数字化转型项目汇报方案(附下载方式)
  • Leetcode 3650. Minimum Cost Path with Edge Reversals
  • Linux学习:实现简单的共享内存通信
  • 06多段代码复杂度合成规则
  • 学习日志37 python
  • [优选算法专题二滑动窗口——水果成篮]
  • PyTorch数据处理工具箱(数据处理工具箱概述)