图像的线性变换和非线性变换
【摘要】
图像的线性变换和非线性变换,逐像素运算就是对图像的没一个像素点的亮度值,通过一定的函数关系,转换到新的亮度值。这个转换可以由函数表示:
...
图像的线性变换和非线性变换,逐像素运算就是对图像的没一个像素点的亮度值,通过一定的函数关系,转换到新的亮度值。这个转换可以由函数表示:
s = f ( r ) s = f( r ) s=f(r)
其中r为原来的像素值,s为新的像素值,通常采用的函数了单调函数进行变换。
线性变换
:
s ( x , y ) = c + k r ( x , y ) s(x,y) =c+kr(x,y) s(x,y)=c+kr(x,y)
其中c和k均为常数
非线性变换
:
s = a + l n ( r + 1 ) b l n c s=a+\frac {ln(r+1)} {blnc} s=a+blncln(r+1)
其中a,b,c为常数
Gamma变换
:
s = c r γ s = cr^γ s=crγ
其中c为常数,通常取1,γ也为常数,r的范围为[0,255],通常会放缩到[0,1]
图为γ取不同值时的情况,例如,当原图像的像素值为0.2时,γ=1.5时,现图像的像素值小于0.2,γ=1时,现图像的像素值等于0.2.当γ=0.5时,现图像的像素值大于0.4.
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
对于不同灰度图和彩色图像,利用不同方式展
示,定义show()
函数
def show(img):
if img.ndim == 2:
plt.imshow(img, cmap='gray',vmin=0,vmax=255)
else:
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))#cv用的BGR,需要转换为RGB
plt.show()
读取图片
img = cv.imread("./pic/cat500x480.jpg",0) #0表示读为灰度图
show(img)
线性变换
:
b = 20
k = 2
img2 = b + k * img.astype(np.int32) #img的类型为uint8,线性变换后,像素值会循环
img2 = np.clip(img2,0,255) #利用np.clip来截断
show(img2)
np.clip
是一个截取函数,用于截取数组中小于或者大于某值的部分,并使得被截取部分等于固定值。
也可以内置函数cv.convertScaleAbs
实现
alpha = 2
beta = 20
img3 = cv.convertScaleAbs(img, alpha=alpha, beta=beta)#利用内置函数来截断
show(img3)
非线性变换
:
img4 = 10 + np.log(img.astype(np.float32)+1)/ 0.1
show(img4)
Gama变换
:
img01 = img / 255
img05 = np.power(img01,0.5)*255
img15 = np.power(img01,1.5)*255
show(np.hstack([img05,img,img15]))
文章来源: beishan.blog.csdn.net,作者:北山啦,版权归原作者所有,如需转载,请联系作者。
原文链接:beishan.blog.csdn.net/article/details/126740981
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)