Как обнаружить края изображения с помощью Python

У меня возникли проблемы с обнаружением краев на изображениях, соответствующих отверстиям в образце стекла. Изображения выглядят следующим образом:

изображения

Одиночный образец:

Каждое изображение содержит часть отверстия, вырезанного в образце стекла. Просматривая изображения глазами, я ясно вижу две области: стекло и отверстие. К сожалению, все методы правильного обнаружения края не привели к хорошим результатам. Основная причина, почему мои попытки не увенчались успехом, я считаю, это недостаточный контраст между стеклом и дыркой. Отверстие не прорезается на всю толщину стекла, в результате чего стеклянное дно в отверстии рассеивает свет обратно в камеру, что ухудшает контраст для меня.

Вещи обработки изображений, которые я уже пробовал:

  • размытие (гауссово, двустороннее)
  • заточка
  • регулировка контрастности
  • фильтрация среднего сдвига
  • адаптивное пороговое определение
  • тонкое обнаружение краев
  • обнаружение края Собеля
  • сегментация водораздела

Для съемки я использую промышленную камеру с кольцевой подсветкой из светодиодов. Кольцевую подсветку можно только включить или выключить, я не могу регулировать направление света или яркость. Получение изображений с разным временем экспозиции и аналоговым усилением не дало особых результатов, поскольку контраст оставался неизменным на протяжении всех измерений.

Есть ли у кого-нибудь идеи, какие шаги я мог бы предпринять, чтобы правильно обнаружить края изображений? Будь то обработка изображений, программирование или советы о том, как делать более качественные снимки, любая идея приветствуется!

Вот отрывок из моего сценария:

import cv2
image = cv2.imread(
    r'path/to/images')
blurred = cv2.GaussianBlur(image, (7, 7), 9)
gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255,
                            cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 71, 5)
edges = cv2.Canny(thresh, 100, 200)

contours, _ = cv2.findContours(
    edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

output_image = image.copy()
for contour in contours:
    cv2.drawContours(output_image, [contour], -1, (0, 255, 0), 2)
cv2.imshow('Circle Edge', cv2.resize(output_image, (1000, 1000)))
cv2.waitKey(0)
cv2.destroyAllWindows()

с обнаруженными краями, окрашенными в зеленый цвет на исходном изображении (найдены на изображениях в этом посте)

Заранее спасибо!

уже упоминалось в предыдущем тексте предприняты различные шаги по обработке/манипулированию изображениями

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

Christoph Rackwitz 28.06.2024 12:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне кажется, что дисперсия/однородность значительно различается в двух областях изображения, поэтому, возможно, стоит рассмотреть возможность расчета дисперсии/стандартного отклонения внутри каждого блока размером 25x25 пикселей и нормализации результата.

Здесь я делаю это с помощью ImageMagick, потому что я делаю это быстрее, но вы можете сделать то же самое с OpenCV:

magick YOURIMAGE.bmp -statistic standarddeviation 25x25 -normalize result.png


Если вы затем зальете однородную область с некоторым допуском, вы получите:

Я ценю фотографии :)

Christoph Rackwitz 28.06.2024 18:14

@ChristophRackwitz Да, и они бесплатны. Хороших выходных!

Mark Setchell 28.06.2024 18:16

Спасибо за предложение. Мне удалось реализовать это на Python, и это работает довольно хорошо.

ladies 05.07.2024 12:48

Другие вопросы по теме