个性化阅读
专注于IT技术分析

Python如何实现图像强度转换操作?

本文概述

将强度转换应用于图像以进行对比度控制或图像阈值处理。这些在空间域中, 即, 它们直接在手边的图像像素上执行, 而不是在图像的傅立叶变换上执行。

以下是常用的强度转换:

  1. 图像负片(线性)
  2. 对数转换
  3. 幂律(Gamma)变换
  4. 分段线性变换函数
Python |图像强度转换操作1

空间域过程–

可以使用以下公式描述空间域过程:

g(x,y)= T [f(x,y)]

其中

f(x,y)

T是f在点(x, y)的邻域上的算子

g(x,y)

是输出。

Python |图像强度转换操作2

负片–

在此讨论负片文章。在数学上, 假定图像从强度级别0变为(L-1)。通常, L =256。那么, 负变换可以由以下表达式描述s = L-1-r其中r是像素的初始强度级别, s是像素的最终强度级别。这产生照相底片。

对数转换–

数学上,对数变换可以表示为s = clog(1+r)。这里,s是输出强度,r>=0是像素的输入强度,c是缩放常数。C由255/(log (1 + m))给出,其中m是图像中的最大像素值。这样做是为了确保最终的像素值不超过(L-1)或255。在实际应用中,对数转换将窄范围的低强度输入值映射为大范围的输出值。

考虑以下输入图像。

Python |图像强度转换操作3

以下是将对数转换应用于图像的代码。

import cv2
import numpy as np
  
# Open the image.
img = cv2.imread( 'sample.jpg' )
  
# Apply log transform.
c = 255 /(np.log( 1 + np. max (img)))
log_transformed = c * np.log( 1 + img)
  
# Specify the data type.
log_transformed = np.array(log_transformed, dtype = np.uint8)
  
# Save the output.
cv2.imwrite( 'log_transformed.jpg' , log_transformed)

以下是对数转换后的输出。

Python |图像强度转换操作4

幂法(伽马)变换–

幂律(gamma)转换可以数学表示为

s = cr ^ {\ gamma}

。伽玛校正对于在屏幕上正确显示图像非常重要, 以防止从具有不同显示设置的不同类型的显示器观看图像时图像变白或变暗。这样做是因为我们的眼睛以伽马形曲线感知图像, 而相机则以线性方式捕获图像。以下是应用伽玛校正的Python代码。

import cv2
import numpy as np
  
# Open the image.
img = cv2.imread( 'sample.jpg' )
  
# Trying 4 gamma values.
for gamma in [ 0.1 , 0.5 , 1.2 , 2.2 ]:
      
     # Apply gamma correction.
     gamma_corrected = np.array( 255 * (img /255 ) * * gamma, dtype = 'uint8' )
  
     # Save edited images.
     cv2.imwrite( 'gamma_transformed' + str (gamma) + '.jpg' , gamma_corrected)

以下是针对不同伽玛值的伽玛校正输出。

伽玛= 0.1:

Python |图像强度转换操作5

伽玛= 0.5:

Python |图像强度转换操作6

伽马= 1.2:

Python |图像强度转换操作7

伽马= 2.2:

Python |图像强度转换操作8

从输出以及gamma> 1的图形(由对应于图形上” nth power”标签的曲线表示)可以看出, 像素的强度降低, 即图像变暗。另一方面, 如果gamma <1(由与图形中”第n个根”标签相对应的曲线表示), 强度会增加, 即图像变亮。

分段线性变换函数–

顾名思义, 这些函数实际上并不是完全线性的。但是, 它们在某些x间隔之间是线性的。对比度拉伸是最常用的分段线性变换函数之一。

对比度可以定义为:

Contrast =  (I_max - I_min)/(I_max + I_min)

此过程扩大了图像中强度级别的范围, 以使其覆盖相机/显示器的整个强度。下图显示了与对比度拉伸相对应的曲线图。

Python |图像强度转换操作9

使用(r1, s1), (r2, s2)作为参数, 该函数通过实质上降低暗像素的强度并增加亮像素的强度来拉伸强度级别。如果r1 = s1 = 0和r2 = s2 = L-1, 该函数在图形中变成一条直线(不起作用)。函数是单调增加的, 因此像素之间的强度级别的顺序得以保留。

以下是执行对比拉伸的Python代码。

import cv2
import numpy as np
  
# Function to map each intensity level to output intensity level.
def pixelVal(pix, r1, s1, r2, s2):
     if ( 0 <= pix and pix <= r1):
         return (s1 /r1) * pix
     elif (r1 <pix and pix <= r2):
         return ((s2 - s1) /(r2 - r1)) * (pix - r1) + s1
     else :
         return (( 255 - s2) /( 255 - r2)) * (pix - r2) + s2
  
# Open the image.
img = cv2.imread( 'sample.jpg' )
  
# Define parameters.
r1 = 70
s1 = 0
r2 = 140
s2 = 255
  
# Vectorize the function to apply it to each value in the Numpy array.
pixelVal_vec = np.vectorize(pixelVal)
  
# Apply contrast stretching.
contrast_stretched = pixelVal_vec(img, r1, s1, r2, s2)
  
# Save edited image.
cv2.imwrite( 'contrast_stretch.jpg' , contrast_stretched)

输出如下:

Python |图像强度转换操作10

首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。


赞(0) 打赏
未经允许不得转载:srcmini » Python如何实现图像强度转换操作?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏