operaciones morfológicas OpenCV (dilatación y erosión) - Python

Definición de los elementos estructurales

El elemento central es definir estructura morfológica en OpenCV-Python puede utilizar su propia función getStructuringElement puede utilizarse directamente ndarray NumPy para definir un elemento estructural. 
prototipo:

Mat getStructuringElement(int shape, //核的形状  0:矩形  1:十字交叉形  2: 椭圆 
                          Size ksize,//核大小
                          Point anchor=Point(-1,-1) //核中心位置,默认位于形状中心处
                          );

Elementos definen una estructura con funciones getStructuringElement:

element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

Esto define una estructura cruciforme de 5 × 5 elementos, como sigue:

Escribir imágenes describen aquí

NumPy también se puede utilizar para definir los elementos estructurales, como sigue:

NpKernel = np.uint8(np.zeros((5,5)))
for i in range(5):
    NpKernel[2, i] = 1
    NpKernel[i, 2] = 1

Estos elementos estructurales tanto de la misma manera definida:

[[0 0 1 0 0]
 [0 0 1 0 0]
 [1 1 1 1 1]
 [0 0 1 0 0]
 [0 0 1 0 0]]

Aquí se puede observar, con la incorporada en constante OpenCV-Python define una elipse (MORPH_ELLIPSE) y una estructura en forma de cruz (MORPH_CROSS) elemento es más simple, si la definición de un rectángulo (MORPH_RECT) y los elementos de encargo estructurales, tanto el mismo.

En este artículo se va a hacer la prueba de referencia "aplicación de visión por ordenador Opencv2 Programación Cookbook" en las secciones relevantes de la imagen: 
Escribir imágenes describen aquí

La erosión y la dilatación

El siguiente es un ejemplo de una imagen antes de grabar cómo utilizar elementos estructurales:

#coding=utf-8
import cv2
import numpy as np

img = cv2.imread('D:/binary.bmp',0)
#OpenCV定义的结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))

#腐蚀图像
eroded = cv2.erode(img,kernel)
#显示腐蚀后的图像
cv2.imshow("Eroded Image",eroded);

#膨胀图像
dilated = cv2.dilate(img,kernel)
#显示膨胀后的图像
cv2.imshow("Dilated Image",dilated);
#原图像
cv2.imshow("Origin", img)

#NumPy定义的结构元素
NpKernel = np.uint8(np.ones((3,3)))
Nperoded = cv2.erode(img,NpKernel)
#显示腐蚀后的图像
cv2.imshow("Eroded by NumPy kernel",Nperoded);

cv2.waitKey(0)
cv2.destroyAllWindows()

Como se indicó anteriormente, el proceso de erosión y dilatación es muy simple, sólo establece el elemento de configuración, a continuación, cada llamada cv2.erode (...) y cv2.dilate (...) para la función, en el que el primer parámetro es la imagen a procesar, El segundo elemento estructural. Devolver bien el procesamiento de imágenes.

Los resultados son como sigue: 
Escribir imágenes describen aquí

Operación de apertura y cierre

Entender la morfología de los estudiantes conocen el procesamiento básico, operación de apertura y cierre es a la erosión y la dilatación se procesan en un orden determinado. Pero los dos no son reversibles, que cerró antes y no se puede obtener la imagen original. Los ejemplos de código son los siguientes:

#coding=utf-8
import cv2
import numpy as np

img = cv2.imread('D:/binary.bmp',0)
#定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))

#闭运算
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
#显示腐蚀后的图像
cv2.imshow("Close",closed);

#开运算
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#显示腐蚀后的图像
cv2.imshow("Open", opened);

cv2.waitKey(0)
cv2.destroyAllWindows()

Operación de cierre está conectado por error a la pluralidad de objetos pequeños en, y operación de apertura para la eliminación de motas de ruido formado por la imagen. Por lo tanto, en algunos casos usando tanto la operación continua. Tales como una imagen binaria usando una operación de cierre continuo y funcionamiento del objeto principal de apertura en la imagen obtenida. Del mismo modo, si desea eliminar el ruido de la imagen (es decir, la imagen "puntos"), la primera imagen se puede utilizar con la operación de apertura y cierre, sino que también eliminará algunos de los objetos rotos.

Los resultados de la operación de apertura de la imagen original y la operación de cierre de la siguiente manera:

Escribir imágenes describen aquí

Mediante la detección de borde de la esquina operación morfológica y

Aquí por un ejemplo más complejo de cómo utilizar operadores morfológicos para detectar los bordes y las esquinas de la imagen (como se describe en el presente documento es sólo un ejemplo de procesamiento morfológico, uso o similar Canny algoritmo Harris uso práctico).

La detección de bordes 
principio de detección de bordes morfológica es muy simple, cuando se expande, la imagen del objeto se quiere alrededor de "expansión", cuando la corrosión, los objetos en la imagen será "reducir". La comparación de estas dos imágenes, una región de la que el cambio se produce sólo en los bordes. Así que luego restando las dos imágenes, la imagen de bordes se obtiene en el objeto. Aquí todavía se utiliza en referencia "Opencv2 Computer Vision programación de aplicaciones Cookbook" secciones relevantes de la imagen: 
Escribir imágenes describen aquí

Código es el siguiente:

#coding=utf-8
import cv2
import numpy

image = cv2.imread("D:/building.jpg",0);
#构造一个3×3的结构元素 
element = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
dilate = cv2.dilate(image, element)
erode = cv2.erode(image, element)

#将两幅图像相减获得边,第一个参数是膨胀后的图像,第二个参数是腐蚀后的图像
result = cv2.absdiff(dilate,erode);

#上面得到的结果是灰度图,将其二值化以便更清楚的观察结果
retval, result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY); 
#反色,即对二值图每个像素取反
result = cv2.bitwise_not(result); 
#显示图像
cv2.imshow("result",result); 
cv2.waitKey(0)
cv2.destroyAllWindows()

resultados de procesamiento son los siguientes: 
Escribir imágenes describen aquí

esquina de detección 
y el borde de detección es diferentes esquinas del proceso de detección de un poco menos complicado. Pero el mismo principio, excepto que la estructura de píxeles del elemento de expansión con la primera forma de cruz, en este caso sólo en el borde, "expansión", el punto de esquina no cambia. A continuación, grabar la imagen original con los elementos estructurales del diamante, lo que sólo la esquina va a "reducir", ninguno de los cambios borde recto.

El segundo paso es la expansión de la imagen original, la parte de la esquina relación de expansión con el X-conformado para ser más. Cuando este segundo bloque con la corrosión, esquina restitución, mientras que el lado a ser grabado más. Cuando se restan las dos imágenes, dejando sólo una esquina. Diagrama a continuación (Esquema de referencia "Opencv2 aplicación de visión por ordenador Programación Cookbook"): 
Escribir imágenes describen aquí

Código es el siguiente:

#coding=utf-8
import cv2

image = cv2.imread("D:/building.jpg", 0)
origin = cv2.imread("D:/building.jpg")
#构造5×5的结构元素,分别为十字形、菱形、方形和X型
cross = cv2.getStructuringElement(cv2.MORPH_CROSS,(5, 5))
#菱形结构元素的定义稍麻烦一些
diamond = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
diamond[0, 0] = 0
diamond[0, 1] = 0
diamond[1, 0] = 0
diamond[4, 4] = 0
diamond[4, 3] = 0
diamond[3, 4] = 0
diamond[4, 0] = 0
diamond[4, 1] = 0
diamond[3, 0] = 0
diamond[0, 3] = 0
diamond[0, 4] = 0
diamond[1, 4] = 0
square = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
x = cv2.getStructuringElement(cv2.MORPH_CROSS,(5, 5))
#使用cross膨胀图像
result1 = cv2.dilate(image,cross)
#使用菱形腐蚀图像
result1 = cv2.erode(result1, diamond)

#使用X膨胀原图像 
result2 = cv2.dilate(image, x)
#使用方形腐蚀图像 
result2 = cv2.erode(result2,square)

#result = result1.copy()
#将两幅闭运算的图像相减获得角 
result = cv2.absdiff(result2, result1)
#使用阈值获得二值图
retval, result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY)

#在原图上用半径为5的圆圈将点标出。
for j in range(result.size):
    y = j / result.shape[0] 
    x = j % result.shape[0] 

    if result[x, y] == 255:
        cv2.circle(image, (y, x), 5, (255,0,0))

cv2.imshow("Result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Tenga en cuenta que, debido al paquete, ndarray sistema de coordenadas y una función de los parámetros NumPy OpenCV utilizados en diferentes sistemas de coordenadas, se puede ver en la línea 46. Estoy tomando el tiempo para hablar de la lista de correo OpenCV, ver a mi entender no es correcta. 
Podemos comprobar, por ejemplo, insertar dos líneas de código en el código, se puede conocer el resultado:

cv2.circle(image, (5, 10), 5, (255,0,0))
image[5, 10] = 0

Puede ser detectado por el código anterior para las esquinas de imagen y marcado, el efecto es el siguiente: 
Escribir imágenes describen aquí 
Por supuesto, esto es sólo un ejemplo de procesamiento morfológico, el resultado de la detección no es bueno.

Referencia: https://blog.csdn.net/JohinieLi/article/details/8104127

Publicados 352 artículos originales · ganado elogios 115 · vistas 130 000 +

Supongo que te gusta

Origin blog.csdn.net/Aidam_Bo/article/details/104469098
Recomendado
Clasificación