OpenCV - 6 图像线性及非线性变换、图像融合

图像线性及非线性变换、图像融合

图像的线性、非线性变换

  • 逐像素运算
    逐像素运算就是对图像中的每个像素点的亮度值,通过一定的函数关系转换到新的亮度值。这个转换可以由函数关系表示 s = f ( r ) s=f(r) s=f(r)其中,r 表示原来的像素值,s 表示新的像素值。
    通常采用单调函数进行变换。

  • 线性变换
    s ( x , y ) = k r ( x , y ) + c s(x,y)=kr(x,y) + c s(x,y)=kr(x,y)+c

  • 非线性变换
    s ( x , y ) = a + l n ( r ( x , y ) + 1 ) b   l n c s(x,y)=a+\frac{ln(r(x,y)+1)}{b\space lnc} s(x,y)=a+b lncln(r(x,y)+1)
    其中a,b,c为常数

  • Gamma变换
    s ( x , y ) = c   r ( x , y ) γ s(x,y)=c\space r(x,y)^\gamma s(x,y)=c r(x,y)γgamma函数中 c=1 时,不同 γ \gamma γ值对应的函数图像如下
    在这里插入图片描述

  1. 线性变换
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np


def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.show()


img = cv.imread('cat.jpg', 0)

# 线性变换:s(x,y) = b + kr(x,y)
b = 20
k = 2
img2 = b + k * img.astype(np.float32)  # 避免在变换过程中由超过255的值会继续循环到新的值
img2 = np.clip(img2, 0, 255)  # 将img中小于0的值转为0,大于255的值转为255
show(np.hstack([img, img2]))

在这里插入图片描述

img3 = cv.convertScaleAbs(img, alpha=1.5, beta=10)  # cv中的图像线性变换api:fx = alpha * img + bata
show(np.hstack([img, img2, img3]))

在这里插入图片描述

  1. 非线性变换
# 非线性变换:s(x,y)=a+(ln(r(x,y)+1))/(b*ln(c))
img4 = 10 + np.log(img.astype(np.float32) + 1) / 0.1
img4 = np.clip(img4, 0, 255)
show(img4)

在这里插入图片描述
3. Gamma变换

# Gamma变换:s(x,y)=cr(x,y)^Gamma
img01 = img / 255

img05 = np.power(img01, 0.5) * 255
img15 = np.power(img01, 1.5) * 255

show(np.hstack([img05, img, img15]))

在这里插入图片描述

图像融合

# 图像融合
A = cv.imread("flower.png")
B = cv.imread('hedgehog.png')
M = cv.imread('mask.png')

show(np.hstack([A, B, M]))

在这里插入图片描述

# 选中刺猬
M = M / 255
Bs = B * M

# 选中花
As = A * (1 - M)

# 两图融合
nice = As * 0.9 + Bs * 0.8  # 乘系数是为了边缘过渡自然

show(nice.astype(np.uint8))

cv.imwrite('nice.jpg', nice)  # 保存图像

在这里插入图片描述

完整代码

# https://www.bilibili.com/video/BV1YA411K7pp?p=11

"""
图像的线性和非线性变换

逐像素运算就是对图像中的每个像素点的亮度值,通过一定的函数关系转换到新的亮度值,
这个转换可以由函数表示    s=f(r)    其中r为原来的像素值,s为新的像素值。通常采用的函数为单调函数进行变化。

线性变换: s(x,y) = b + kr(x,y)
非线性变换:s(x,y)=a+(ln(r(x,y)+1))/(b*ln(c))
                其中,a,b,c为常数。
Gamma变换:s(x,y)=cr(x,y)^Gamma
"""
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np


def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.show()


img = cv.imread('cat.jpg', 0)

# 线性变换:s(x,y) = b + kr(x,y)
b = 10
k = 1.5
img2 = b + k * img.astype(np.float32)  # 转换数值为np.float32,避免在变换过程中由超过255的值会继续循环到新的值
img2 = np.clip(img2, 0, 255)  # 将img中小于0的值转为0,大于255的值转为255
# show(np.hstack([img, img2]))

img3 = cv.convertScaleAbs(img, alpha=1.5, beta=10)
# show(np.hstack([img, img2, img3]))

# 非线性变换:s(x,y)=a+(ln(r(x,y)+1))/(b*ln(c))
img4 = 10 + np.log(img.astype(np.float32) + 1) / 0.1
img4 = np.clip(img4, 0, 255)
# show(img4)

# Gamma变换:s(x,y)=cr(x,y)^Gamma
img01 = img / 255

img05 = np.power(img01, 0.5) * 255
img15 = np.power(img01, 1.5) * 255

# show(np.hstack([img05, img, img15]))


# 图像融合
A = cv.imread("flower.png")
B = cv.imread('hedgehog.png')
M = cv.imread('mask.png')

show(np.hstack([A, B, M]))

# 选中刺猬
M = M / 255
Bs = B * M

# 选中花
As = A * (1 - M)

# 两图融合
nice = As * 0.9 + Bs * 0.8  # 乘系数是为了边缘过渡自然

show(nice.astype(np.uint8))

cv.imwrite('nice.jpg', nice)  # 保存图像
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Opencv-python图像变换是通过使用不同的变换矩阵来实现的。其中,平移是一种最简单的空间变换。使用Opencv的函数cv2.warpAffine()可以实现平移操作。在代码中,我们需要定义一个变换矩阵M,这个矩阵是一个2行3列的矩阵,决定了平移的方式。其中,M矩阵中的tx和ty分别表示在x和y方向上平移的距离。更具体地说,如果我们向右平移tx个像素,向下平移ty个像素,那么变换矩阵M的定义如下: import numpy as np rows, cols = img.shape[:2] M = np.float32([[1, 0, tx], [0, 1, ty]]) dst = cv2.warpAffine(img, M, (cols, rows)) 在上述代码中,我们使用了NumPy库来创建一个2x3的浮点型变换矩阵M,并将其传递给cv2.warpAffine()函数,该函数会将图像img按照定义的方式进行平移,并生成一个新的图像dst。最后,我们可以通过cv2.imshow()函数显示平移后的图像。 除了平移之外,Opencv还提供了其他的图像变换操作,比如缩放。缩放可以按照指定的宽度和高度来调整图像的大小,也可以按照比例来进行缩放。通过cv2.resize()函数可以实现缩放操作。在代码中,我们可以使用下面的方式来进行缩放操作: import cv2 img = cv2.imread('drawing.jpg') # 按照指定的宽度、高度缩放图片 res = cv2.resize(img, (width, height)) # 按照比例缩放图片 res2 = cv2.resize(img, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR) 在上面的代码中,我们首先使用cv2.imread()函数读取图像,并将其存储在变量img中。然后,我们可以使用cv2.resize()函数来调整图像的大小。其中,如果我们指定了宽度和高度,那么图像将按照这些指定的大小进行缩放;如果我们指定了fx和fy的比例因子,那么图像将按照这些比例进行缩放。最后,我们可以使用cv2.imshow()函数来显示缩放后的图像。 总结起来,Opencv-python提供了多种图像变换操作,包括平移、缩放等。通过使用相应的函数和变换矩阵,我们可以实现对图像的各种变换操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv-python 详解图像的几何变换缩放、平移、旋转、翻转](https://blog.csdn.net/RayChiu757374816/article/details/120036004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值