我想模糊圖像,而不使用像blur()一樣的opencv預定義函數。我正在使用標準平均值而不是加權平均值。這裏是我的代碼,但結果仍然與輸入圖像相同。這是3x3。模糊圖像由標準的平均值C++
IplImage* img = cvLoadImage(argv[1]);
IplImage* dst = cvCloneImage(img);
height = img->height;
width = img->width;
step = img->widthStep;
channels = img->nChannels;
data = (uchar *)img->imageData;
height2 = dst->height; // row
width2 = dst->width; // col
step2 = dst->widthStep; // size of aligned image row in bytes
channels2 = dst->nChannels;
dstData = (uchar *)dst->imageData;
int total = 0;
//blur
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
for (x = 0; x <= 2; x++)
for (y = 0; y <= 2; y++)
total =(data[x-1,y-1]+data[x-1,y]+data[x-1,y+1]+
data[x,y-1]+data[x,y]+data[x,y+1]+
data[x+1,y-1]+data[x+1,y]+data[x+1,y+1])/9;
dstData[i,j] = total;
}
}
我想我的問題是在這一個
total =(data[x-1,y-1]+data[x-1,y]+data[x-1,y+1]+
data[x,y-1]+data[x,y]+data[x,y+1]+
data[x+1,y-1]+data[x+1,y]+data[x+1,y+1])/9;
dstData[i,j] = total;
什麼可以做?
逗號運算符會導致一個非常常見的錯誤:'data [x-1,y-1]'等於'data [y-1]'。多維數組由一個線性內存塊表示,因此您需要類似'data [x-1 +(y-1)* width]'(您確定像素是由單個字節表示的嗎?) ,您應該檢查邊界,因爲當x = 0時,訪問像素(x-1,y)無效。 – riv
在opencv圖像的行末端可能會有填充,因此請使用widthStep跳轉到下一行。考慮圖像數據類型,可能與uchar不同!考慮圖像通道,你可能不想在不同的通道中模糊。如果用戶傳遞RGB圖像,則您的濾鏡會一起模糊RGB。 OpenCv以形式012012012012(數字表示通道ID)存儲多通道圖像 – dousin
看起來像問題是您總是調用同一個區域進行模糊處理:try'total =(data [(i-1 +(j-1))* width ] ..../9;'但是正如@riv所提到的那樣,您需要檢查邊界錯誤,以便數組不會嘗試從負數位置獲取數據。 – GMasucci