Чем отличаются эти алгоритмы свертки?
Зачем y=0
а также y<1, x = 0; x < 1
и другие y=1
а также y <-1, x < - 1
,
for(int y = 0; y < grey.rows; y++)
for(int x = 0; x < grey.cols; x++)
dst.at<uchar>(y,x) = 0;
Это вторая свертка:
for(int y = 1; y < grey.rows - 1; y++){
for(int x = 1; x < grey.cols - 1; x++)
Первый цикл не является «сверточным», так как операция присваивания имеет «ядро» размера 1. Второй пример кажется использовать ядро размером 3, поэтому для работы ему нужно 3 пикселя: prev / curr / next (вот почему for
петли «короче»)
В первых двух циклах for код просто инициализирует массив вероятных результатов.
Во вторых двух петлях свертка включает в себя сверточное ядро это 3×3, поэтому код в цикле будет ссылаться на элементы, начиная с dst.at<uchar>(y-1 , x-1)
в dst.at<uchar>(y+1 , x+1)
,
Таким образом, ядро не может быть оценено по границам, оно только начинается с пикселей, размещенных от 1 вместо 0, и заканчивается до n-2 вместо n-1.