У меня возникли проблемы с обнаружением краев на изображениях, соответствующих отверстиям в образце стекла. Изображения выглядят следующим образом:
Одиночный образец:
Каждое изображение содержит часть отверстия, вырезанного в образце стекла. Просматривая изображения глазами, я ясно вижу две области: стекло и отверстие. К сожалению, все методы правильного обнаружения края не привели к хорошим результатам. Основная причина, почему мои попытки не увенчались успехом, я считаю, это недостаточный контраст между стеклом и дыркой. Отверстие не прорезается на всю толщину стекла, в результате чего стеклянное дно в отверстии рассеивает свет обратно в камеру, что ухудшает контраст для меня.
Вещи обработки изображений, которые я уже пробовал:
Для съемки я использую промышленную камеру с кольцевой подсветкой из светодиодов. Кольцевую подсветку можно только включить или выключить, я не могу регулировать направление света или яркость. Получение изображений с разным временем экспозиции и аналоговым усилением не дало особых результатов, поскольку контраст оставался неизменным на протяжении всех измерений.
Есть ли у кого-нибудь идеи, какие шаги я мог бы предпринять, чтобы правильно обнаружить края изображений? Будь то обработка изображений, программирование или советы о том, как делать более качественные снимки, любая идея приветствуется!
Вот отрывок из моего сценария:
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()
с обнаруженными краями, окрашенными в зеленый цвет на исходном изображении (найдены на изображениях в этом посте)
Заранее спасибо!
уже упоминалось в предыдущем тексте предприняты различные шаги по обработке/манипулированию изображениями
Мне кажется, что дисперсия/однородность значительно различается в двух областях изображения, поэтому, возможно, стоит рассмотреть возможность расчета дисперсии/стандартного отклонения внутри каждого блока размером 25x25 пикселей и нормализации результата.
Здесь я делаю это с помощью ImageMagick, потому что я делаю это быстрее, но вы можете сделать то же самое с OpenCV:
magick YOURIMAGE.bmp -statistic standarddeviation 25x25 -normalize result.png
Если вы затем зальете однородную область с некоторым допуском, вы получите:
Я ценю фотографии :)
@ChristophRackwitz Да, и они бесплатны. Хороших выходных!
Спасибо за предложение. Мне удалось реализовать это на Python, и это работает довольно хорошо.
вся обработка не поможет. вам нужно подумать о том, как сделать технически полезные снимки, как использовать свет и тень и, возможно, отражение. по этим фотографиям я не совсем понимаю, как они были сделаны (с какого ракурса). Вы говорите, что у вас есть стеклянный корпус и в нем просверлено глухое отверстие. Я предполагаю, что поверхности (дно и стенки) отверстия шероховатые, а естественная поверхность стеклянного корпуса гладкая. кривые не соответствуют моим ожиданиям. для иллюстрации вам следует показать изображение всей сцены.