OpenCV 05(图像的算术与位运算)

一、图像的算术运算

1.1 图像的加法运算

  • add opencv使用add来执行图像的加法运算

图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的.

python 复制代码
import cv2
import numpy as np

cat = cv2.imread('D:\\3-project\\zyj\\pythonCNN\\pic\\cat.jpeg')
dog = cv2.imread('D:\\3-project\\zyj\\pythonCNN\\pic\\dog.jpeg')

print(cat.shape)
print(dog.shape)
cat1=cat[:360, :499]
print(cat1.shape)

new_img= cv2.add(cat1, dog)

cv2.imshow('new',new_img)
cv2.waitKey(0)

另外一种写法:

python 复制代码
# 图片加法
import cv2

cat = cv2.imread('./cat.jpeg')
dog = cv2.imread('./dog.jpeg')

# 加法要求两个图片大小一致
print(cat.shape)
print(dog.shape)
# 把猫的图片变小
# 注意坑. opencv中resize中传递新的宽度和高度, 先宽度再高度, 所有是先列后行, 和shape的输出反了.
new_cat = cv2.resize(cat, (dog.shape[:-1][::-1]))
# 和单个数字运算, 超过255 会被截断, 相当于 % 256
print(new_cat[0:5, 0:5])
print(new_cat[0:5, 0:5] + 100) 
cv2.imshow('cat_dog', np.hstack((new_cat, dog)))
# 加法, 加法的效果是加起来如果超过255, 统一变成255
new_img = cv2.add(new_cat, dog)
print(new_img[0:5, 0:5])
cv2.imshow('cat_dog', np.hstack((new_cat, dog, new_img)))


cv2.waitKey(0)
cv2.destroyAllWindows()

opencv中resize中传递新的宽度和高度, 先宽度再高度, 所有是先列后行, 和shape的输出反了
`dog.shape:-1` 它用于获取图像的高度和宽度,但排除了通道数(如果图像是多通道的话)。

假设 `dog` 是一个图像,那么 `dog.shape` 将返回一个包含三个值的元组,通常形式为 `(height, width, channels)`,

通过使用切片 `:-1`,我们从形状元组中排除了最后一个元素(通道数),因此得到一个包含高度和宽度的子元组,即 `(height, width)`。

`dog.shape::-1` 是一个 Python 表达式,用于反转图像 `dog` 的形状信息。让我解释这个表达式的含义:

  1. `dog.shape`:这部分获取图像 `dog` 的形状信息。`shape` 是一个属性,用于获取图像的维度信息。通常,它返回一个元组,其中包含三个值,分别表示高度、宽度和通道数。例如,对于彩色图像,形状可能是 `(height, width, channels)`。

  2. `::-1`:这是 Python 的切片(slicing)操作,它将元组中的元素反转顺序。在这里,它用于交换元组中的元素位置,将 `(height, width, channels)` 变成了 `(channels, width, height)`。

综合起来,`dog.shape::-1` 返回一个反转后的形状元组,通常用于将图像的形状信息调整为某些库或函数的期望输入格式。这种操作在图像处理和计算机视觉任务中可能会有用,特别是当需要将通道数移动到元组的第一个位置时。

缩小图像到新尺寸 (width, height)

new_size = (300, 200)

resized_image = cv2.resize(image, new_size)

放大图像到新尺寸 (width, height)

new_size = (600, 400)

resized_image = cv2.resize(image, new_size)

1.2 图像的减法运算

  • subtract

  • opencv使用subtract来执行图像的减法运算, 图像对应位置的元素相减, 如果减完小于0, 统一变成0.

python 复制代码
import cv2
  
  cat = cv2.imread('./cat.jpeg')
  dog = cv2.imread('./dog.jpeg')
  
  # 加法要求两个图片大小一致
  print(cat.shape)
  print(dog.shape)
  # 把猫的图片变小
  # 注意坑. opencv中resize中传递新的宽度和高度, 先宽度再高度, 所有是先列后行, 和shape的输出反了.
  new_cat = cv2.resize(cat, (dog.shape[:-1][::-1]))
  
  # 减法
  new_img = cv2.subtract(new_cat, dog)
  print(new_cat[0:5, 0:5], dog[0:5, 0:5])
  print(new_img[0:5, 0:5])
  cv2.imshow('cat_dog', np.hstack((new_cat, dog, new_img)))
  
  
  cv2.waitKey(0)
  cv2.destroyAllWindows()

同样的还有乘法, 除法运算. cv2.mutiply, cv2.divide

1.3 图像的融合

  • cv2.addWeighted(src1, alpha, src2, beta, gamma)

  • 图片的融合操作相当于对图片进行线性运算 w1* x1 + w2 * x2 + b. 其中alpha是第一个权重参数, beta是第二个权重参数, gamma是偏差.

python 复制代码
  import cv2
  
  cat = cv2.imread('./cat.jpeg')
  dog = cv2.imread('./dog.jpeg')
  
  new_cat = cv2.resize(cat, (dog.shape[:-1][::-1]))
  # 相当于res = new_cat * 0.4 + dog * 0.6 + 0
  res = cv2.addWeighted(new_cat, 0.4, dog, 0.6, 0)
  
  cv2.imshow('cat_dog', np.hstack((new_cat, dog, res)))
  
  
  cv2.waitKey(0)
  cv2.destroyAllWindows()

二、OpenCV的位运算

bitwise_not(img) 非操作的效果就相当于是用 255 - img

python 复制代码
  import cv2
  import numpy as np
  
  cat = cv2.imread('./cat.jpeg')
  dog = cv2.imread('./dog.jpeg')
  
  cat_not = cv2.bitwise_not(cat)
  cat_not_not = cv2.bitwise_not(cat_not)
  cv2.imshow('not', np.hstack((cat, cat_not, cat_not_not)))
  print(cat[:3, :3])
  print(cat_not[:3, :3])
  print(cat_not_not[:3, :3]
        
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  • bitwise_and(img1, img2) 与运算, 图片对应位置元素进行与操作. 表现出来的效果就是黑和黑与还是黑, 白和白与还是白.
python 复制代码
  import cv2
  import numpy as np
  
  cat = cv2.imread('./cat.jpeg')
  dog = cv2.imread('./dog.jpeg')
  
  new_cat = cv2.resize(cat, (dog.shape[:-1][::-1]))
  cat_and_dog = cv2.bitwise_and(new_cat, dog)
  cv2.imshow('not', np.hstack((new_cat, cat_and_dog)))
  print('cat:', new_cat[:3, :3])
  print('-----------')
  print('dog:', dog[:3, :3])
  print('-----------')
  print(cat_and_dog[:3, :3])
  
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  • bitwise_or 或运算 对应元素做或运算

  • bitwise_xor 异或运算 对应元素做异或运算

python 复制代码
  import cv2
  import numpy as np
  
  #创建一张图片
  img = np.zeros((200,200), np.uint8)
  img2 = np.zeros((200,200), np.uint8)
  
  img[20:120, 20:120] = 255
  img2[80:180, 80:180] = 255
  
  #new_img = cv2.bitwise_bit(img)
  #new_img = cv2.bitwise_and(img, img2)
  #new_img = cv2.bitwise_or(img, img2)
  new_img = cv2.bitwise_xor(img, img2)
  
  
  cv2.imshow('new_img', new_img)
  cv2.imshow('img', img)
  cv2.imshow('img2', img2)
  cv2.waitKey(0)
相关推荐
冬奇Lab4 小时前
Workflow 系列(04):Multi-Agent 协调——编排器边界、并发控制与上下文隔离
人工智能·工作流引擎
冬奇Lab4 小时前
每日一个开源项目(第147篇):HyperGraphRAG - 用超图表示 N 元关系,RAG 的第三代范式
人工智能·开源·graphql
甲维斯5 小时前
Github + 阿里云oss实现类似codex的自动更新!
人工智能
阿里云大数据AI技术6 小时前
光轮智能 × 阿里云:共建 Physical AI 云上数据、评测与持续学习基础设施
人工智能·机器学习
机器之心6 小时前
实锤了:Claude Code偷查用户,时区、中国AI实验室全是关键词
人工智能·openai
网易云信6 小时前
Cursor点燃个人开发者,企业级AI为何频频受挫?Agent工厂从提效工具到AI员工的跃迁
人工智能·开源
网易云信7 小时前
解锁触手可及的温暖:网易智企 x Wander Puffs AI 云游泡芙
人工智能
转转技术团队7 小时前
从 PRD 到可验证代码:AI 需求开发闭环实践
人工智能