Python + OpenCV lograr imagen de bordes SOBEL operador de detección, ROBERT

 A Python borde de la imagen SOBEL operador de detección, ROBERT, el proceso para lograr el procesamiento de imagen a cabo ciertas funciones puede ser un poco áspero en Jupyter Notebook. Instalar en librerías OpenCV puede referirse a: instalación de Python en Bibliotecas de OpenCV y algunas de las cuestiones que se resumen .

 

1. Implementar el código

Importación CV2
 importación numpy AS NP
 importación matplotlib.pyplot AS plt 

# implementar función de imagen de color anti- 
DEF PointInvert (IMG): 
    altura, anchura, _ = img.shape
     para i en (altura) de la gama:
         para J en la gama (ancho): 
            PI = IMG [i, j] 
            IMG [i, j] = 255 - PI
 retorno IMG 

# leer la imagen de gradación originales 
src_s = cv2.imread ( " dip_switch_02.bmp " ) 
cv2.imshow ( " src_s " , src_s)# imagen original llamado "src_s" muestran 
# imagen anti-colores 
= src PointInvert (src_s) 
cv2.imshow ( " src " , src) # src_s fotografía denominada "src" después del proceso de anti-color y muestra la 

# recuento SOBEL sub 
Sobel cv2.Sobel = (src, cv2.CV_64F ,. 1 ,. 1, ksize =. 7 ) 
cv2.imshow ( " Sobel " , Sobel) # después de que el operador src SOBEL procesamiento de imágenes llamado "sobel" y se muestra 
# la imagen de color anti- 
sobel2 = PointInvert (Sobel) 
cv2.imshow ( " sobel2 " , sobel2) # Sobel imagen llamada así por el color invertido para "sobel2" y se muestra 

# ROBERT operador 
DEF Robert (IMG):
    h, w, _  =img.shape 
    rob = [[-1, -1], [1,1 ]]
     para x en gama (h):
         para y en rango (w):
             si (y + 2 <= w) y (x + 2 <= h): 
                imgChild = img [x: x + 2, y: y + 2, 1 ] 
                list_robert = rob * imgChild 
                img [x, y] = abs (list_robert.sum ()) # 求和加绝对值
    volver img 
Robert = Robert (src) 
cv2.imshow ( " Robert " , Robert) #Después de que el operador de fotos de Robert src llamado "Robert" y se muestra 

# imagen de color anti- 
robert2 = PointInvert (Robert) 
cv2.imshow ( " robert2 " , robert2) # foto Robert nombrado así por el color invertido "robert2" y se muestran 
cv2.waitKey (0)

 

2. Los resultados de la ejecución

 

 

 

 

 

 

 

 

 

 

 

3. Los problemas y las soluciones encontradas

(1) en tiempo de ejecución: ValueError: demasiados valores para desempaquetar (esperar 2)

Código de error: H, W = img.shape

razón de error:

En primer lugar entender img.shape [0], [1], [2].

img.shape [0]: el tamaño vertical de la imagen (altura)

img.shape [1]: la imagen a tamaño horizontal (anchura)

img.shape [2]: número de canales de la imagen

En la matriz, [0] indica el número de líneas en [1], indica el número de columnas.

Se puede observar, el valor de retorno de parámetros por defecto img.shape es el número tres, y yo no especificó faltante.

solución:

El parámetro no se utiliza aquí como el número de imagen de canal usando de _ representa menos que el código de parámetro h, w = img.shape a h, w, _ = img.shape.

 

(2) tiempo de ejecución: ValueError: operandos no podían ser transmitidos junto con formas (2,2) (2,2,3)

Código de error: list_robert = Rob * imgChild

razón de error:

Después de buscar solución en línea, que nos pareció ser una violación de la ufunc mecanismo de difusión. mecanismo de difusión es la siguiente:

当使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同)。如果两个数组的shape不同的话,会进行如下的广播(broadcasting)处理:

1)让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐。

2)输出数组的shape是输入数组shape的各个轴上的最大值。

3)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错。

4)当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值。

我们图片的shape是(h,w,c),而列表的shape是(x:x+2, y:y+2),根据规则1可知列表的shape拓展应为(x:x+2, y:y+2,1);由规则2可知输出数组的shape应为(h,w,c),列表的shape不满足规则3,所以出错。

解决方法:

将代码imgChild = img[x:x+2, y:y+2]改为imgChild = img[x:x+2, y:y+2, 1]。

 

Supongo que te gusta

Origin www.cnblogs.com/BIXIABUMO/p/12639418.html
Recomendado
Clasificación