Processamento de imagem Python丨Transformação linear em tons de cinza de imagens

Resumo: Este artigo explica principalmente a transformação linear em tons de cinza.

Este artigo é compartilhado pela Huawei Cloud Community " [Python Image Processing] Fifteen. Grayscale Linear Transformation of Images ", autor: eastmount.

1. Princípio da transformação linear em tons de cinza da imagem

A transformação linear em tons de cinza de uma imagem consiste em ajustar os tons de cinza da imagem original estabelecendo um mapeamento em tons de cinza, melhorando assim a qualidade da imagem, destacando os detalhes da imagem e melhorando o contraste da imagem. A fórmula de cálculo da transformação linear em tons de cinza é a seguinte:

Nesta fórmula, DB representa o valor em tons de cinza após a transformação linear em tons de cinza, DA representa o valor em tons de cinza da imagem de entrada antes da transformação e α e b são os parâmetros da equação de transformação linear f(D), que representam a inclinação e a interceptação, respectivamente.

  • Quando α=1, b=0, mantenha a imagem original
  • Quando α=1, b!=0, todos os valores em tons de cinza da imagem são movidos para cima ou para baixo
  • Quando α=-1, b=255, o valor de cinza da imagem original é invertido
  • Quando α>1, o contraste da imagem de saída é aprimorado
  • Quando 0<α<1, o contraste da imagem de saída diminui
  • Quando α<0, a área escura da imagem original fica mais clara, a área clara fica mais escura e a imagem é complementada.

Conforme mostrado na figura, o mapa de efeitos correspondente à transformação linear em tons de cinza da imagem é exibido.

2. Transformação de deslocamento ascendente em escala de cinza da imagem

Este algoritmo realizará o deslocamento para cima do valor de cinza da imagem, melhorando assim o brilho da imagem.O código de implementação é o seguinte. Como o valor de cinza da imagem está dentro do intervalo de 0 a 255, é necessário realizar um julgamento de estouro no valor de cinza.

# -*- 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+50
for i in range(height):
 for j in range(width):
 if (int(grayImage[i,j]+50) > 255):
            gray = 255
 else:
            gray = int(grayImage[i,j]+50)
        result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

O resultado de saída é mostrado na figura abaixo, todos os valores de tons de cinza da imagem são deslocados para cima em 50 e a imagem fica mais branca. Observe que o valor da escala de cinza correspondente ao preto puro é 0 e o valor da escala de cinza correspondente ao branco puro é 255.

3. Transformação de aprimoramento de contraste de imagem

Esse algoritmo melhorará o contraste da imagem e o código de implementação do Python é o seguinte:

# -*- 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*1.5
for i in range(height):
 for j in range(width):
 if (int(grayImage[i,j]*1.5) > 255):
            gray = 255
 else:
            gray = int(grayImage[i,j]*1.5)
        result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)

A saída é mostrada na figura abaixo, com todos os valores de tons de cinza da imagem aprimorados por um fator de 1,5.

Quatro. Transformação de redução de contraste de imagem

Esse algoritmo reduzirá o contraste da imagem e o código de implementação do Python é o seguinte:

# -*- 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*0.8
for i in range(height):
 for j in range(width):
        gray = int(grayImage[i,j]*0.8)
        result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

A saída é mostrada na imagem abaixo, onde todos os valores de tons de cinza da imagem são reduzidos e a imagem fica mais escura.

Cinco. Transformação de cor inversa em tons de cinza da imagem

A transformação de cor inversa, também conhecida como transformação linear de complemento em tons de cinza, é o processo de inverter os valores de pixel da imagem original, ou seja, o preto se torna branco e o branco se torna preto. Seu código de implementação em Python é o seguinte:

# -*- 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=255-DA
for i in range(height):
 for j in range(width):
        gray = 255 - grayImage[i,j]
        result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

O resultado da saída é mostrado na figura abaixo, e os valores em tons de cinza antes e depois do processamento da imagem são complementares.

A transformação de cores inversas em tons de cinza da imagem tem certas aplicações no processamento de imagens médicas, conforme mostrado na figura a seguir:

PS: O artigo refere-se à sua série anterior de artigos de processamento de imagens e funções da biblioteca OpenCV, e também se refere aos seguintes documentos:

 

Clique em Seguir para conhecer as novas tecnologias da HUAWEI CLOUD pela primeira vez~

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

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/5570409
Recomendado
Clasificación