Eu escrevi um pequeno script em python, onde estou tentando extrair ou cortar a parte do baralho que representa apenas a arte, removendo todo o resto. Eu tenho tentado vários métodos de limiar, mas não consegui chegar lá. Observe também que não posso simplesmente gravar manualmente a posição do trabalho artístico, porque ele nem sempre está na mesma posição ou tamanho, mas sempre em uma forma retangular, onde todo o resto é apenas texto e bordas.
from matplotlib import pyplot as plt
import cv2
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)
binary = cv2.bitwise_not(binary)
kernel = np.ones((15, 15), np.uint8)
closing = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
plt.imshow(closing),plt.show()
A saída atual é a coisa mais próxima que pude obter. Eu poderia estar no caminho certo e tentar algumas discussões adicionais para desenhar um retângulo em torno das partes brancas, mas não acho que seja um método sustentável:
Como última observação, veja os cartões abaixo, nem todos os quadros têm exatamente os mesmos tamanhos ou posições, mas sempre há uma obra de arte com apenas texto e bordas ao redor. Não precisa ser super precisamente cortado, mas claramente a arte é uma "região" do cartão, cercada por outras regiões contendo algum texto. Meu objetivo é tentar capturar a região da obra de arte o melhor que puder.
fonte
Respostas:
Usei a transformação de linha Hough para detectar partes lineares da imagem. Os cruzamentos de todas as linhas foram usados para construir todos os retângulos possíveis, que não contêm outros pontos de cruzamento. Como a parte do cartão que você está procurando é sempre o maior desses retângulos (pelo menos nas amostras que você forneceu), eu simplesmente escolhi o maior desses retângulos como vencedor. O script funciona sem a interação do usuário.
Estes são os resultados com as amostras que você forneceu:
O código para encontrar cruzamentos de linha pode ser encontrado aqui: encontre o ponto de interseção de duas linhas desenhadas usando linhas abreviadas opencv
Você pode ler mais sobre as linhas Hough aqui .
fonte
Sabemos que as cartas têm limites retos ao longo dos eixos x e y. Podemos usar isso para extrair partes da imagem. O código a seguir implementa a detecção de linhas horizontais e verticais na imagem.
Você só precisa clicar em duas áreas para incluir. Uma área de clique de amostra e o resultado correspondente são os seguintes:
Resultados de outras imagens:
fonte
Não acho que seja possível cortar automaticamente o ROI da arte finala usando técnicas tradicionais de processamento de imagem devido à natureza dinâmica das cores, dimensões, locais e texturas de cada cartão. Você precisaria examinar o aprendizado de máquina / profundo e treinar seu próprio classificador, se quiser fazê-lo automaticamente. Em vez disso, aqui está uma abordagem manual para selecionar e cortar um ROI estático de uma imagem.
A idéia é usar
cv2.setMouseCallback()
manipuladores de eventos para detectar se o mouse foi clicado ou liberado. Para esta implementação, você pode extrair o ROI do trabalho artístico mantendo pressionado o botão esquerdo do mouse e arrastando para selecionar o ROI desejado. Depois de selecionar o ROI desejado, pressionec
para cortar e salvar o ROI. Você pode redefinir o ROI usando o botão direito do mouse.ROIs de obras de arte salvas
Código
fonte