opencv learning dezenove: expansão e corrosão

Inchar

Insira a descrição da imagem aqui** Estilo negrito **Insira a descrição da imagem aquiInsira a descrição da imagem aqui

Um: dilatar para conseguir dilatar

Como usar: dilate
result = cv2.dilate (imagem binária src, kernel de convolução k, itreations)
array quadrado de kernel de convolução: como np.ones ((5,5), np.uint8)

import cv2 as cv
import numpy as np

def dilate_demo(image):  #膨胀
    print(image.shape)
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
    dst = cv.dilate(binary,kernel)
    cv.imshow("dilate_demo",dst)

src = cv.imread("./5.png")  #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
cv.imshow("input image",src)    #通过名字将图像和窗口联系

dilate_demo(src)

cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows()  #销毁所有窗口

Explicação:
No processo de uso do opencv, geralmente precisamos de uma variedade de kernels de convolução. Se for um núcleo quadrado, numpy pode ser usado, mas às vezes precisamos definir um núcleo oval ou em forma de cruz, precisamos usar elementos estruturais

O
primeiro parâmetro de cv2.getStructuringElement () representa a forma do núcleo. Três tipos de
retângulos podem ser selecionados : MORPH_RECT;
forma de cruz: MORPH_CROSS;
elipse: MORPH_ELLIPSE; o
segundo parâmetro indica o tamanho do núcleo.

Observe que o objeto deve ser branco, o objeto neste artigo é preto, então eu uso a desbinarização no código
Insira a descrição da imagem aqui

Dois: para atingir erosão

A corrosão visa principalmente imagens binárias, como apenas dois valores de 0 e 1,
dois objetos de entrada: 1 imagem binária original, 2 kernel de convolução
usa o kernel de convolução para percorrer a imagem binária original, se o kernel de convolução corresponder ao elemento O valor é 1 e seu valor é 1, caso contrário, ele é 0.
Ou seja, substitua o pixel central atual pelo menor elemento correspondente ao kernel de convolução.

Efeito de corrosão: o tamanho do objeto é reduzido em um pixel, a borda do objeto é suavizada e a conexão peninsular entre as imagens é enfraquecida ou segmentada.

Uso: erode - tradução chinesa:
Resultado do processamento de erosão = cv2.erode (imagem original src, kernel do kernel de convolução, iterações)
Kernel do kernel de convolução: geralmente uma matriz quadrada
como: k = np.ones ((5,5), np.uint8 ) O
número de iterações iterações: o número de corrosão, o padrão é 1

def erode_demo(image):  #腐蚀
    print(image.shape)
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))  #可以修改卷积核大小来增加腐蚀效果,越大腐蚀越强
    dst = cv.erode(binary,kernel)
    cv.imshow("erode_demo",dst)

src = cv.imread("./5.png")  #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
cv.imshow("input image",src)    #通过名字将图像和窗口联系

erode_demo(src)

cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows()  #销毁所有窗口

Insira a descrição da imagem aqui

kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))

Insira a descrição da imagem aqui
Suplemento de conhecimento relevante
(1) Pode ser considerado como expansão para expandir a área branca, e corrosão é para expandir a área preta.
(2) É possível processar imagens coloridas sem processamento em tons de cinza
(1) Expansão

kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.dilate(src,kernel)
cv.imshow("result",dst)

Insira a descrição da imagem aqui(2) Corrosão

kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.erode(src,kernel)
cv.imshow("result",dst)

Insira a descrição da imagem aqui(Três) Método getStructuringElement

Para personalizar um kernel de elemento estrutural, você precisa declarar um Mat e, em seguida, atribuir valores aos elementos do Mat; este método é flexível, mas um pouco complicado

OpenCV fornece uma função getStructuringElement, que pode obter a forma de elementos estruturais comumente usados: retângulo (incluindo linha), elipse (incluindo círculo) e cruz.

Não há otimização dentro de getStructuringElement, ele apenas encapsula algumas funções. O princípio também é declarar um tapete, então encontrar a forma e especificar o valor do tapete.
A forma de cruz é uma única largura de linha.

Resumindo: getStructuringElement é uma maneira mais conveniente de implementar um kernel

MORPH_RECT , MORPH_ELLIPSE , MORPH_CROSS

parâmetro:

cv.getStructuringElement (cv.MORPH_RECT, (3, 3))

def getStructuringElement (shape, ksize, anchor = None): # assinatura real desconhecida; restaurado do doc

A forma do primeiro parâmetro: representa a forma do kernel, existem três formas para escolher

Retângulo: MORPH_RECT;
Cruz: MORPH_CORSS;
Oval: MORPH_ELLIPSE;

O segundo parâmetro ksize: é o tamanho do kernel (n, n)

O terceiro parâmetro âncora: a posição do ponto de âncora

Valor de retorno: a
função getStructuringElement retornará o elemento da estrutura da forma e tamanho especificados.

Acho que você gosta

Origin blog.csdn.net/weixin_44145452/article/details/112798499
Recomendado
Clasificación