저와 함께 파이썬 이미지 처리 배우기丨이미지의 회색조 비선형 변환이란 무엇입니까?

개요: 이 기사는 주로 회색조 선형 변환에 대해 설명하며 기본 지식이 도움이 되기를 바랍니다.

이 기사는 HUAWEI CLOUD Community " [Python Image Processing] 16. Logarithmic Transformation and Gamma Transformation of Grayscale Nonlinear Transformation of Images ", 작성자: eastmount에서 공유됩니다.

이 기사에서는 주로 비선형 변환에 대해 설명하고 로그 변환 및 감마 변환을 포함하여 이미지를 회색조로 만드는 사용자 지정 방법을 사용합니다.

1. 이미지 그레이스케일 비선형 변환

영상의 계조 비선형 변환은 주로 대수 변환, 거듭제곱 변환, 지수 변환 및 조각별 함수 변환이 있으며, 영상의 계조 처리는 비선형 관계를 통해 수행되며, 다음은 주로 3가지 일반적인 회색조 비선형 변환 유형에 대해 설명합니다.

원본 영상의 회색 값은 DB=DA×DA/255의 공식에 따라 비선형적으로 변환되며 코드는 다음과 같다.

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('miao.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像灰度非线性变换:DB=DA×DA/255
for i in range(height):
 for j in range(width):
 gray = int(grayImage[i,j])*int(grayImage[i,j]) / 255
 result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

이미지 회색조 비선형 변환의 출력 결과는 다음 그림과 같습니다.

2. 이미지 그레이스케일 대수 변환

이미지 회색조의 대수 변환은 일반적으로 다음 공식으로 표현됩니다.

여기서 c는 스케일 비교 상수, DA는 원본 이미지 회색 값, DB는 변환된 대상 회색 값입니다. 아래 그림과 같이 대수 곡선 아래에서 회색 값의 변화를 나타냅니다.

대수 곡선은 픽셀 값이 낮은 영역에서 기울기가 크고 픽셀 값이 높은 영역에서 기울기가 작기 때문에 이미지를 대수 변환한 후 어두운 영역의 대비가 향상됩니다. 이 변환을 사용하여 이미지의 어두운 세부 사항을 향상할 수 있으므로 압축된 고가치 이미지에서 더 어두운 픽셀을 확장할 수 있습니다.

대수 변환은 낮은 계조 값을 확장하고 높은 계조 값을 압축하는 효과를 실현하며 스펙트럼 이미지 표시에 널리 사용됩니다. 일반적인 응용 프로그램은 동적 범위가 0에서 106까지 넓을 수 있는 푸리에 스펙트럼입니다. 스펙트럼이 직접 표시될 때 이미지 표시 장치의 동적 범위는 종종 요구 사항을 충족하지 못하므로 어두운 세부 사항이 많이 손실됩니다. 대수 변환을 사용하여 이미지의 동적 범위는 다음과 같습니다. 동적 범위는 명확하게 표시될 수 있도록 합리적으로 비선형적으로 압축됩니다. 아래 이미지에서 변환되지 않은 스펙트럼은 저회색 영역의 대비를 높이기 위해 로그 변환되어 어두운 영역의 디테일을 향상시킵니다.

다음 코드는 이미지 회색조의 로그 변환을 구현합니다.

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
#绘制曲线
def log_plot(c):
    x = np.arange(0, 256, 0.01)
    y = c * np.log(1 + x)
 plt.plot(x, y, 'r', linewidth=1)
 plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文标签
 plt.title(u'对数变换函数')
 plt.xlim(0, 255), plt.ylim(0, 255)
 plt.show()
#对数变换
def log(c, img):
 output = c * np.log(1.0 + img)
 output = np.uint8(output + 0.5)
 return output
#读取原始图像
img = cv2.imread('test.png')
#绘制对数变换曲线
log_plot(42)
#图像灰度对数变换
output = log(42, img)
#显示图像
cv2.imshow('Input', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

다음 그림은 대수함수 처리 후의 효과를 나타낸 것으로, 전체 대비가 낮고 계조값이 낮은 이미지 향상 효과에 대수 변환이 더 좋습니다.

해당 로그 함수 곡선이 그림에 나와 있습니다.

3. 이미지 그레이스케일 감마 변환

지수 변환 또는 전력 변환이라고도 하는 감마 변환은 일반적으로 사용되는 또 다른 회색조 비선형 변환입니다. 이미지 그레이스케일의 감마 변환은 일반적으로 다음 공식으로 표현됩니다.

  • γ>1일 때, 이미지에서 그레이 레벨이 높은 영역은 늘어나고 그레이 레벨이 낮은 부분은 압축됩니다.
  • γ<1일 때, 이미지에서 그레이 레벨이 낮은 영역은 늘어나고 그레이 레벨이 높은 부분은 압축됩니다.
  • γ=1일 때, 계조 변환은 선형이고 원본 이미지는 선형 방식으로 변경됩니다.

Python은 주로 power 함수를 호출하여 구현하는 이미지 회색조의 감마 변환 코드를 다음과 같이 구현합니다.

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
#绘制曲线
def gamma_plot(c, v):
    x = np.arange(0, 256, 0.01)
    y = c*x**v
 plt.plot(x, y, 'r', linewidth=1)
 plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文标签
 plt.title(u'伽马变换函数')
 plt.xlim([0, 255]), plt.ylim([0, 255])
 plt.show()
#伽玛变换
def gamma(img, c, v):
 lut = np.zeros(256, dtype=np.float32)
 for i in range(256):
 lut[i] = c * i ** v
 output_img = cv2.LUT(img, lut) #像素灰度值的映射
 output_img = np.uint8(output_img+0.5) 
 return output_img
#读取原始图像
img = cv2.imread('test.png')
#绘制伽玛变换曲线
gamma_plot(0.00000005, 4.0)
#图像灰度伽玛变换
output = gamma(img, 0.00000005, 4.0)
#显示图像
cv2.imshow('Imput', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

다음 그림은 감마 변환 처리 후의 효과를 보여줍니다.감마 변환은 이미지 대비가 낮고 전체 밝기 값이 높을 때(또는 카메라 과다 노출로 인해) 명백한 이미지 향상 효과가 있습니다.

해당 멱법칙 함수 곡선은 그림 1에 나와 있습니다.

 

HUAWEI CLOUD의 새로운 기술에 대해 처음으로 알아보려면 팔로우를 클릭하세요~

{{o.name}}
{{m.name}}

рекомендация

отmy.oschina.net/u/4526289/blog/5572461