2010-09-06 22 views

Respuesta

1

Pruebe usar cvThreshold en su lugar.

+0

@Mark: thresholding doesnt help, debes encontrar los píxeles más brillantes y su ubicación. –

+0

¿Cómo no ayuda? Umbral primero para aumentar su intensidad al máximo, y luego use su cvMinMaxLoc para encontrar dónde están. – mpen

+0

cvMinMaxLoc brinda solo la ubicación de un píxel brillante, ¿puedo encontrar otro loc con la misma intensidad? –

1

esta es una manera simple pero unneficient/estúpido para hacerlo:

for i=1:100 
    get brightest pixel using cvMinMaxLoc 
    store location 
    set it to a value of zero 
end 

si no le importa acerca de la eficiencia que esto debería funcionar.

también debe comprobar cvInRangeS para buscar otros píxeles de valores similares que definan umbrales bajos y altos.

1

Debe calcular el umbral de brillo del histograma. Luego itera a través de los píxeles para obtener las posiciones que son lo suficientemente brillantes como para satisfacer el umbral. El programa siguiente lugar se aplica el umbral a la imagen y muestra el resultado con fines de demostración:

#!/usr/bin/env python3 

import sys 
import cv2 
import matplotlib.pyplot as plt 

if __name__ == '__main__': 
    if len(sys.argv) != 2 or any(s in sys.argv for s in ['-h', '--help', '-?']): 
     print('usage: {} <img>'.format(sys.argv[0])) 
     exit() 
    img = cv2.imread(sys.argv[1], cv2.IMREAD_GRAYSCALE) 
    hi_percentage = 0.01 # we want we the hi_percentage brightest pixels 
    # * histogram 
    hist = cv2.calcHist([img], [0], None, [256], [0, 256]).flatten() 
    # * find brightness threshold 
    # here: highest thresh for including at least hi_percentage image pixels, 
    #  maybe you want to modify it for lowest threshold with for including 
    #  at most hi_percentage pixels 
    total_count = img.shape[0] * img.shape[1] # height * width 
    target_count = hi_percentage * total_count # bright pixels we look for 
    summed = 0 
    for i in range(255, 0, -1): 
     summed += int(hist[i]) 
     if target_count <= summed: 
      hi_thresh = i 
      break 
    else: 
     hi_thresh = 0 
    # * apply threshold & display result for demonstration purposes: 
    filtered_img = cv2.threshold(img, hi_thresh, 0, cv2.THRESH_TOZERO)[1] 
    plt.subplot(121) 
    plt.imshow(img, cmap='gray') 
    plt.subplot(122) 
    plt.imshow(filtered_img, cmap='gray') 
    plt.axis('off') 
    plt.tight_layout() 
    plt.show() 
0

Bueno, la forma más lógica es para repetir todo el cuadro, a continuación, obtener el valor max y min de los píxeles. Luego elija un umbral que le dará el porcentaje deseado (1% en su caso). Después de eso iterar nuevamente y guardar las coordenadas i y j de cada píxel por encima del umbral dado. De esta manera iterará la matriz solo dos veces en lugar de 100 (o 1% de los píxeles por veces) y elegirá la más brillante y la eliminará.

Las alfombras OpenCV son matrices multidimensionales. La imagen gris es una matriz bidimensional con valores de 0 a 255. Puede iterar a través de la matriz de esta manera. for(int i=0;i < mat.height();i++) for(int j=0;j < mat.width();j++) mat[i][j];

Cuestiones relacionadas