Образец, который вы разместили, имеет относительно сильную перспективу (он не отображается прямо в направлении нормали поверхности), что может вызвать проблемы с методами сопоставления шаблонов с использованием обработки блоков. Я предполагаю, что вы должны сделать изображение с сильной перспективой, поэтому первое, что мы хотим сделать, - это оценить преобразование изображения, которое удалит перспективную проекцию и приведет к выпрямленному изображению («прямое изображение»).
Исправление проекции перспективы, когда форма известна
Конечная цель предварительной обработки - найти углы этого серого прямоугольника, который является фоном цветовой диаграммы. Я начал просто с порога с постоянным значением. Литература / Интернет содержит много информации о том, как выполнить настройку порога, когда изображение имеет неравномерное освещение, но если вы можете, попробуйте исправить настройку изображения так, чтобы освещение было относительно равномерным.
![Порог с постоянным значением](https://i.stack.imgur.com/UW503.png)
Я предположил, что цветовая диаграмма занимает довольно большую часть экрана, поэтому это, вероятно, самая большая непрерывная область изображения. Существует много функций черно-белой маркировки (MATLABs bwlabel, IPPs LabelMarkers, OpenCV имеет внешнюю библиотеку cvblob), которая дает каждому отдельному связанному региону свой собственный индекс. После маркировки вы можете рассчитать площади подключенных компонентов, используя гистограмму, а затем выбрать компонент с наибольшей площадью.
![Найти самый большой блоб](https://i.stack.imgur.com/TF1P9.png)
Обычно рекомендуется заполнить компоненты так, чтобы у компонента не было отверстий, это уменьшает количество краевых пикселей.
![Заполните каплю](https://i.stack.imgur.com/hvo92.png)
Теперь мы можем использовать операторы поиска краев (я использовал метод на основе градиента, но вы также можете отслеживать края, следуя белым пикселям, которые связаны с черными пикселями), чтобы получить пиксели, принадлежащие границе.
![Найти края](https://i.stack.imgur.com/OXO2f.png)
Поскольку интересующий нас объект - это прямоугольник, я подгонял четыре линии к краевым пикселям с помощью надежной подгонки линий (RANSAC). После нахождения новой линии я удалил все точки, которые были близки к найденной линии, это вынуждает последующие операции подгонки возвращать другие ребра объекта. Наконец, когда все ребра были найдены, я вычислил все возможные пересечения между множеством линий. Из множества полученных точек я удалил все точки за пределами изображения.
Теперь у нас есть углы цветовой диаграммы и, поскольку мы знаем размеры диаграммы, мы можем вычислить матрицу преобразования (гомография, проекция между двумя плоскостями. Использовать прямое линейное преобразование (DLT) для решения ) между миллиметровыми координатами и координаты пикселей.HHH
x=HX
Затем эту матрицу преобразования можно использовать для преобразования исходного изображения таким образом, чтобы цветовая диаграмма отображалась прямо в направлении нормали поверхности.
![Подгоните линии к краям](https://i.stack.imgur.com/uBYxB.png)
Как видно, осталось только радиальное искажение. Когда мы использовали преобразование для преобразования изображения (2D-интерполяция), мы выбирали координаты интерполяции так, чтобы мы знали точное разрешение изображения, а это означает, что мы теперь знаем, например, размер букв.H
Если мы все еще хотим выполнить какое-либо сопоставление с шаблоном, мы можем использовать любой подходящий метод сопоставления с шаблоном. Метод не должен быть инвариантным к повороту / масштабированию, поскольку изображение уже выпрямлено.
![Правильная перспектива](https://i.stack.imgur.com/Q1Qky.png)