Обработка изображений Вырезать область, отличную от рисунка - PullRequest
0 голосов
/ 28 февраля 2020

enter image description here

enter image description here

Привет,

Я хочу получить разницу между первым изображением и второе,

Я хочу вырезать числа из изображения.

Я получаю разницу между пикселями, но в результате получается:

enter image description here

Но я хочу вот что:

enter image description here

Можно ли обрезать изображение вот так?

Вот что я сделал:

import cv2 
import numpy as np
from PIL import Image
import pytesseract
import os
import sys

img = Image.open("recherche.png").convert("RGBA")
pattern = Image.open("pattern.png").convert("RGBA")

pixels = img.load()
pixelsPattern = pattern.load()

new = Image.open("new.png").convert("RGBA")
pixelNew = new.load()

for i in range(img.size[0]):
    for j in range(img.size[1]):
         if(pixels[i,j] != pixelsPattern[i,j]):
             pixelNew[i,j] = pixels[i,j]

Я непосредственно получаю разницу в битах, но она не дает мне то, что я хочу, я попробовал medianBlur и подобные вещи, чтобы сделать это как 4-е изображение, но я не могу сделать его четким, как на 4-м изображении.
(4-е изображение я создал вручную с помощью краски.)

1 Ответ

2 голосов
/ 01 марта 2020

Это сложная проблема, потому что шаблон был специально разработан, чтобы его было трудно решить с помощью программного обеспечения.

Я предлагаю следующие шаги:

  • Преобразование img и pattern в двоичные изображения (уровни серого не являются частью числа).
  • Вычислить абсолютная разница img и pattern.
  • Применение закрытие морфологическая операция для закрытия небольших промежутков.

Вот код:

import cv2
import numpy as np

# Read image and pattern as Grayscale images (output of cv2.imread is numpty array).
img = cv2.imread("recherche.png", cv2.IMREAD_GRAYSCALE)
pattern = cv2.imread("pattern.png", cv2.IMREAD_GRAYSCALE)

# Convert img and pattern to binary images (all values above 1 goes to 255)
_, img = cv2.threshold(img, 1, 255, cv2.THRESH_BINARY)
_, pattern = cv2.threshold(pattern, 1, 255, cv2.THRESH_BINARY)

# Compute absolute difference of img and pattern (result is 0 where equal and 255 when not equal)
dif = cv2.absdiff(img, pattern)

# Apply closing morphological operation
dif = cv2.morphologyEx(dif, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)));

dif = 255 - dif  # Inverse polarity

# Display result
cv2.imshow('dif', dif)
cv2.waitKey(0)
cv2.destroyAllWindows()

Результат:
enter image description here

Как видите решение не идеальное, но получить идеальный результат очень сложно ...

...