2016-12-30 4 views
0

Я использую cv2::absdiff() для вычитания скаляра из матрицы изображений. Код я использую:Не могу понять поведение cv2 :: absdiff: C++

double min; 
    double max; 
    Scalar mean; 
    Scalar std_dev; 

    minMaxLoc(img_a_color_planes[1], &min, &max); 
    meanStdDev(img_a_color_planes[1], mean, std_dev); 

    Mat img_a_color_planes[3]; 
    split(img_a, img_a_color_planes); 
    Mat oper = img_a_color_planes[1]; 

    absdiff(oper, mean, oper); 
    divide(oper, std_dev, oper); 
    multiply(oper, 10, oper); 
    add(oper, mean, oper); 

Здесь, я специально переписал зеленый канал img_a в Mat oper, несмотря на выходной матрицы oper уточняются в absdiff. Даже тогда на зеленый цветной канал img_a_color_planes[1] влияет. Я не понимаю причину этого. Как я могу избежать этого? Вот как мой img_a становится пострадавших после absdiff операции:
Начальная img_a:

enter image description here

После absdiff операции:

enter image description here

+0

Что такое mean и std_dev? Зеленый только, или целое изображение? –

+0

Они предназначены только для зеленого канала. Я редактировал свой код. –

+3

'Mat oper = img_a_color_planes [1] .clone();' – Miki

ответ

2

Вопрос заключается в том, что Mat oper = img_a_color_planes[1]; не делает копию базового массива, только данные заголовка. То же самое относится к copy constructor.

Вам необходимо сделать независимую копию, чтобы избежать внесения изменений в исходное изображение. Один из способов сделать это можно с помощью метода clone(): Mat oper = img_a_color_planes[1].clone();. Клонирование использует copyTo() под капотом: https://stackoverflow.com/a/15688165/2988730.

Цитирование Mat docs:

Используйте конструктор копирования или оператор присваивания, где может быть массивом или выражение в правой части (см. Ниже) Как отмечено во введении, назначение массива является операцией O (1), поскольку она только копирует заголовок и увеличивает счетчик ссылок. Метод Mat::clone() может использоваться для получения полной (глубокой) копии массива, когда вам это нужно.

Смежные вопросы