Обнаружение контура штампа на зашумленном изображенииPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обнаружение контура штампа на зашумленном изображении

Сообщение Anonymous »

Во-первых, сложность этой задачи заключалась в том, что шум на краю кубика можно было легко принять за часть края, поэтому, чтобы убрать эти отвлекающие факторы, я использовал серию операций открытия-закрытия в OpenCV. а также добился начального прогресса, как показано на рисунке 1 (но по краям все еще есть некоторый шум, который невозможно удалить, как показано на рисунке 2, но общий эффект хороший).
Рисунок 1,
Рисунок 2
Однако, когда мой алгоритм применяется к другому типу данных с меньшими помехами, слишком много операций открытия-закрытия приводят к тому, что кубик не сегментируется, как показано на рисунке 3.
Рисунок 3< /p>
Если вы хотите попробовать, используйте исходные данные: https://pan.quark.cn/s/93144e062eb9
Большое спасибо и наилучшие пожелания!
Мой код здесь, хотелось бы узнать, как улучшить алгоритм.
import cv2
import numpy as np
def die_select(image):
edge_tag = 0
is_continue = is_error(image)

if not is_continue:
edge_tag = 1
return image, edge_tag

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

image_gray = cv2.bilateralFilter(image_gray, 3, 10, 10)
# threshold = cv2.threshold(image_gray, 0, 1, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)[1]
# _, threshold = cv2.threshold(image_gray, 30, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
threshold = cv2.adaptiveThreshold(image_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 2)

threshold = cv2.bitwise_not(threshold)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))
closed_img = cv2.morphologyEx(threshold, cv2.MORPH_CLOSE, kernel)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
opened_img = cv2.morphologyEx(closed_img, cv2.MORPH_OPEN, kernel)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
closed_img = cv2.morphologyEx(opened_img, cv2.MORPH_CLOSE, kernel)

kernel = np.ones((3, 3), np.uint8)
closed_img = cv2.erode(closed_img, kernel, iterations=2)

kernel = 3
closed_img = cv2.medianBlur(closed_img, kernel)

contours, hierarchy = cv2.findContours(closed_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
if cv2.contourArea(contour) > 1000000:
# print(cv2.contourArea(contour))
cv2.drawContours(image, [contour], -1, (255, 0, 255), 2)
min_rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(min_rect)
box = np.intp(box)
# padding = 1
# box += np.array([[-padding, -padding], [padding, -padding], [padding, padding], [-padding, padding]], dtype=np.int64)
cv2.drawContours(image, [box], 0, (0, 255, 0), 2)
image = get_image_item(image, min_rect, box)
return image, edge_tag

def is_error(input):
image = cv2.cvtColor(input, cv2.COLOR_BGR2GRAY)

height, width = image.shape

black_thread = 5
is_black = (image 10:
# print("错误图片")
return False
else:
return True

def get_image_item(image, rect, box):
# angle = -abs(rect[2]-90) if rect[2] > 45 else abs(rect[2]-90)
#
# rows, cols = image.shape[:2]
# matrix = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, 1)
#
# image = cv2.warpAffine(image, matrix, (cols, rows))
#
# x_min, y_min = np.min(box, axis=0)
# x_max, y_max = np.max(box, axis=0)
# image = image[y_min:y_max, x_min:x_max]
#
# up_width = 1550
# up_height = 1320
# up_points = (up_width, up_height)
#
# image = cv2.resize(image, up_points, interpolation=cv2.INTER_LINEAR)

return image

if __name__ == "__main__":
img = cv2.imread('C:/Users/25838/Desktop/all_source/0_-2.png')
result,_ = die_select(img)
cv2.imwrite('result.png', result)


Подробнее здесь: https://stackoverflow.com/questions/783 ... oisy-image
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Обнаружение контура на зашумленном изображении
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Обнаружение линии на зашумленном изображении
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Как идентифицировать пятна в зашумленном моноцветном изображении с помощью OpenCV и C++?
    Anonymous » » в форуме C++
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Поиск слабой линии на очень зашумленном изображении с переменным фоновым шумом
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Поиск слабой линии на очень зашумленном изображении с переменным фоновым шумом
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»