# Take every Nth element of a matrix

I am trying to create a block average filter of an image.

In Matlab my code looks like:

ba=4; %block average block size
B = ones(ba)/ba^2;
out1 = conv2(double(rgb_img(:,:,1))/255,B,'valid');
out1 = out1(1:ba:end,1:ba:end);
out2 = conv2(double(rgb_img(:,:,2))/255,B,'valid');
out2 = out2(1:ba:end,1:ba:end);
out3 = conv2(double(rgb_img(:,:,3))/255,B,'valid');
out3 = out3(1:ba:end,1:ba:end);


I know how to do the first step using filter2D how do I do the second step (take every 4th element)

edit retag close merge delete

Please apply icon '101010' to your code to help reading

( 2016-05-24 13:15:06 -0600 )edit

Sort by ยป oldest newest most voted

It's not exactly like in Matlab (for border pixel) :

   Mat a = Mat::zeros(16,10,CV_8UC1);
int k=0;
for (int i=0;i<a.rows;i++)
for (int j=0;j<a.cols;j++)
a.at<uchar>(i,j)=k++;
Mat d;
resize(a, d, Size(),0.25,0.25,INTER_NEAREST);
cout<<a<<endl;
cout<<d<<endl;


gives as result :

[  0,   1,   2,   3,   4,   5,   6,   7,   8,   9;
10,  11,  12,  13,  14,  15,  16,  17,  18,  19;
20,  21,  22,  23,  24,  25,  26,  27,  28,  29;
30,  31,  32,  33,  34,  35,  36,  37,  38,  39;
40,  41,  42,  43,  44,  45,  46,  47,  48,  49;
50,  51,  52,  53,  54,  55,  56,  57,  58,  59;
60,  61,  62,  63,  64,  65,  66,  67,  68,  69;
70,  71,  72,  73,  74,  75,  76,  77,  78,  79;
80,  81,  82,  83,  84,  85,  86,  87,  88,  89;
90,  91,  92,  93,  94,  95,  96,  97,  98,  99;
100, 101, 102, 103, 104, 105, 106, 107, 108, 109;
110, 111, 112, 113, 114, 115, 116, 117, 118, 119;
120, 121, 122, 123, 124, 125, 126, 127, 128, 129;
130, 131, 132, 133, 134, 135, 136, 137, 138, 139;
140, 141, 142, 143, 144, 145, 146, 147, 148, 149;
150, 151, 152, 153, 154, 155, 156, 157, 158, 159]
[  0,   4;
40,  44;
80,  84;
120, 124]

more

Official site

GitHub

Wiki

Documentation

## Stats

Asked: 2016-05-24 12:35:19 -0600

Seen: 605 times

Last updated: May 24 '16