Saltar al contenido

Estiramiento de contraste en Python / OpenCV

Solución:

OpenCV no tiene ninguna función para el estiramiento del contraste y Google produce el mismo resultado porque la ecualización del histograma lo hace Estire el histograma horizontalmente, pero es solo la diferencia de la función de transformación. (Ambos métodos aumentan el contraste de las imágenes. La función de transformación transfiere los niveles de intensidad de píxeles del rango dado al rango requerido).

La ecualización del histograma deriva la función de transformación (TF) automáticamente a partir de la función de densidad de probabilidad (PDF) de la imagen dada, donde, en contraste, el estiramiento especifica su propio TF en función de los requisitos de la aplicación.

Un simple TF a través del cual puede hacer estiramientos de contraste es min-max estiramiento de contraste –

((píxel – mínimo) / (máximo – mínimo)) * 255.

Haz esto para cada valor de píxel. min y max son las intensidades mínima y máxima.

También puedes usar cv2.LUT para estirar el contraste creando una tabla personalizada usando np.interp. Los enlaces a su documentación son esto y esto respectivamente. A continuación se muestra un ejemplo.

import cv2
import numpy as np

img = cv2.imread('messi.jpg')
original = img.copy()
xp = [0, 64, 128, 192, 255]
fp = [0, 16, 128, 240, 255]
x = np.arange(256)
table = np.interp(x, xp, fp).astype('uint8')
img = cv2.LUT(img, table)
cv2.imshow("original", original)
cv2.imshow("Output", img)
cv2.waitKey(0)
cv2.destroyAllWindows() 

La mesa creada

[  0   0   0   0   1   1   1   1   2   2   2   2   3   3   3   3   4   4
   4   4   5   5   5   5   6   6   6   6   7   7   7   7   8   8   8   8
   9   9   9   9  10  10  10  10  11  11  11  11  12  12  12  12  13  13
  13  13  14  14  14  14  15  15  15  15  16  17  19  21  23  24  26  28
  30  31  33  35  37  38  40  42  44  45  47  49  51  52  54  56  58  59
  61  63  65  66  68  70  72  73  75  77  79  80  82  84  86  87  89  91
  93  94  96  98 100 101 103 105 107 108 110 112 114 115 117 119 121 122
 124 126 128 129 131 133 135 136 138 140 142 143 145 147 149 150 152 154
 156 157 159 161 163 164 166 168 170 171 173 175 177 178 180 182 184 185
 187 189 191 192 194 196 198 199 201 203 205 206 208 210 212 213 215 217
 219 220 222 224 226 227 229 231 233 234 236 238 240 240 240 240 240 241
 241 241 241 242 242 242 242 243 243 243 243 244 244 244 244 245 245 245
 245 245 246 246 246 246 247 247 247 247 248 248 248 248 249 249 249 249
 250 250 250 250 250 251 251 251 251 252 252 252 252 253 253 253 253 254
 254 254 254 255]

Ahora cv2.LUT reemplazará los valores de la imagen original con los valores de la tabla. Por ejemplo, todos los píxeles que tengan el valor 1 serán reemplazados por 0 y todos los píxeles que tengan el valor 4 serán reemplazados por 1.

Imagen original

Original

Imagen estirada en contraste

ingrese la descripción de la imagen aquí

Los valores de xp y fp se puede variar para crear tablas personalizadas según sea necesario y ampliará el contraste incluso si los píxeles mínimos y máximos son 0 y 255, a diferencia de la respuesta proporcionada por hashcode55.

Python / OpenCV puede hacer un estiramiento de contraste a través del método cv2.normalize () usando la normalización min_max. Por ejemplo:

Aporte:

ingrese la descripción de la imagen aquí

#!/bin/python3.7

import cv2
import numpy as np

# read image
img = cv2.imread("zelda3_bm20_cm20.jpg", cv2.IMREAD_COLOR)

# normalize float versions
norm_img1 = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
norm_img2 = cv2.normalize(img, None, alpha=0, beta=1.2, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

# scale to uint8
norm_img1 = (255*norm_img1).astype(np.uint8)
norm_img2 = np.clip(norm_img2, 0, 1)
norm_img2 = (255*norm_img2).astype(np.uint8)

# write normalized output images
cv2.imwrite("zelda1_bm20_cm20_normalize1.jpg",norm_img1)
cv2.imwrite("zelda1_bm20_cm20_normalize2.jpg",norm_img2)

# display input and both output images
cv2.imshow('original',img)
cv2.imshow('normalized1',norm_img1)
cv2.imshow('normalized2',norm_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Normalizar1:

ingrese la descripción de la imagen aquí

Normalizar2:

ingrese la descripción de la imagen aquí

También puede hacer su propio estiramiento usando una ecuación lineal simple con 2 pares de valores de entrada / salida usando la forma y = A * x + B y resolviendo las dos ecuaciones simultáneas. Consulte el concepto de estiramiento que se muestra en ¿Cómo puedo hacer que la apariencia de degradado de una imagen sea igual a la otra?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *