OpenCV MATLAB: как нарисовать линию с определенным профилем интенсивности?

Ниже приведен произвольный нарисованный от руки профиль интенсивности линии на изображении: введите описание изображения  здесь

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

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

Когда вы столкнетесь с такой ситуацией?

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


person gpuguy    schedule 25.05.2012    source источник


Ответы (1)


Это не совсем обработка изображений, скорее генерация изображений... но тем не менее.

Поскольку вам нужна дуга, нам все еще нужны три точки на этой дуге, давайте возьмем первую, среднюю и последнюю точку (ключевые характеристики, на мой взгляд):

N = 100; % number of pixels
x1 = 1;
x2 = floor(N/2);
x3 = N;

y1 = 242;
y2 = 255;
y3 = 242;

а теперь нарисуйте дугу окружности, содержащую эти точки. Эта проблема уже обсуждалась здесь для Matlab: http://www.mathworks.nl/matlabcentral/newsreader/view_thread/297070

x21 = x2-x1; y21 = y2-y1;
x31 = x3-x1; y31 = y3-y1;
h21 = x21^2+y21^2; h31 = x31^2+y31^2;
d = 2*(x21*y31-x31*y21);
a = x1+(h21*y31-h31*y21)/d; % circle center x
b = y1-(h21*x31-h31*x21)/d; % circle center y
r = sqrt(h21*h31*((x3-x2)^2+(y3-y2)^2))/abs(d); % circle radius

Если вы предполагаете, что среднее значение всегда больше (и, следовательно, вам придется рисовать верхнюю часть круга), вы можете нарисовать это с помощью:

x = x1:x3;
y = b+sqrt(r^2-(x-a).^ 2);
plot(x,y);

вы можете настроить видимое окно с помощью

xlim([1 N]);
ylim([200 260]);

что дает мне следующий результат: arc

person Gunther Struyf    schedule 25.05.2012