OpenCV-图像上的运算学习记录


title: OpenCV-图像上的运算

OpenCV-图像上的运算学习记录

相关代码解析:

  1. cv.addWeighted()
  2. bitwise_and() bitwise_or() bitwise_not() bitwise_xor()
  3. cv.threshold()
    学习代码如下:
import numpy as np
import cv2 as cv

'''
处理图像运算
OpenCV加法和Numpy加法之间有区别:
OpenCV加法是饱和运算,而Numpy加法是模运算。
'''
x = np.uint8([250])
y = np.uint8([10])
print(cv.add(x, y))  # 250 + 10 = 260 -> 255, np像素数组溢出自动变成255(满像素)
print(x + y)  # 250 + 10 = 260 % 256 = 4
'''
图像融合
这也是图像加法,但是对图像赋予不同的权重,以使其具有融合或透明的感觉。
根据以下等式添加图像:
G(x) = (1−α) * f0(x) + α * f1(x)
通过从 α 从 0→1更改,您可以在一个图像到另一个图像之间执行很酷的过渡。
********** PS: 融合的两幅图片分辨率大小和通道需要相同 ************
在这里,我拍摄了两个图像,将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。
cv.addWeighted()在图像上应用以下公式:
dst = α * img1 + β * img2 + γ
在这里,γ 被视为零。
'''
# 图像融合例子
img1 = cv.imread(r'C:\Users\Admin\Desktop\opencv\jumao-002.jpg')
img2 = cv.imread(r'C:\Users\Admin\Desktop\opencv\jumao-001.jpg')
dst = cv.addWeighted(img1, 0.2, img2, 0.8, 0)
cv.imshow('dst', dst)
cv.waitKey(0)
cv.destroyAllWindows()

'''
按位运算
这包括按位 AND、 OR、NOT 和 XOR 操作。
bitwise_and bitwise_or  bitwise_not bitwise_xor
它们在提取图像的任何部分(我们将在后面的章节中看到)、定义和处理非矩形 ROI 等方面非常有用。
'''
# 加载两张图片
image1 = cv.imread(r'C:\Users\Admin\Desktop\opencv\roi.jpg')
image2 = cv.imread(r'C:\Users\Admin\Desktop\opencv\jumao-001.jpg')
print(image2.shape)
print(image2)           # 最外围矩阵[]表示图像像素矩阵,[[]]:内层矩阵表示第几行,[[[]]]:最内层矩阵表示RGB值和第几列
print(image2[0, 0])     # [31 36 37]
print(image2[1, 0])     # [34 39 40]
print(image2[0, 279])   # [20 21 17]
print(image2[185, 279])  # [67 99 128]
print(image2[0, 0, 0])      # 读取图像第0行第0列像素点BGR中的Blue值:31
print(image2.item(0, 0, 0))     # 读取图像第0行第0列像素点BGR中的Blue值:31
# 我想把image2放在左上角,所以我创建了ROI
rows, cols, channels = image2.shape
roi = image1[0:rows, 0:cols]
# 现在创建image2的掩膜(mask),并同时创建其相反掩膜(mask)
image2gray = cv.cvtColor(image2, cv.COLOR_BGR2GRAY)
'''
图像二值化:
定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,
也就是将整个图像呈现出明显的只有黑和白的视觉效果。
灰度值0:黑  灰度值255:白
一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,
常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:
大于T的像素群和小于T的像素群。
这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

retval, dst = cv.threshold( src, thresh, maxval, type[, dst] ) 
参数说明:
src:原图像。
dst:结果图像。
thresh:当前阈值。
maxVal:最大阈值,一般为255.
thresholdType:阈值类型,主要有下面几种:
enum ThresholdTypes {
    THRESH_BINARY     = 0,  大于阈值的部分被置为255,小于部分被置为0
    THRESH_BINARY_INV = 1,  大于阈值部分被置为0,小于部分被置为255
    THRESH_TRUNC      = 2,  大于阈值部分被置为threshold,小于部分保持原样
    THRESH_TOZERO     = 3,  小于阈值部分被置为0,大于部分保持不变
    THRESH_TOZERO_INV = 4,  大于阈值部分被置为0,小于部分保持不变 
    THRESH_MASK       = 7,
    THRESH_OTSU       = 8,
    THRESH_TRIANGLE   = 16
};
返回值:
retval: 与参数thresh一致
dst: 结果图像
使用了THRESH_OTSU和THRESH_TRIANGLE两个标志时,输入图像必须为单通道。
'''
ret, mask = cv.threshold(image2gray, 150, 255, cv.THRESH_BINARY)
cv.imshow('mask', mask)
mask_inv = cv.bitwise_not(mask)
cv.imshow('mask_inv', mask_inv)
# 现在将ROI中logo的区域涂黑
image1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
cv.imshow('image1_bg', image1_bg)
# 仅从logo图像中提取logo区域
image2_fg = cv.bitwise_and(image2, image2, mask=mask)
cv.imshow('image2_fg', image2_fg)
# 将logo放入ROI并修改主图像
dst = cv.add(image1_bg, image2_fg)
cv.imshow('dst', dst)
image1[0:rows, 0:cols] = dst
cv.imshow('res', image1)
cv.waitKey(0)
cv.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值