opencv檢測圖片模糊度演算法
阿新 • • 發佈:2019-01-06
/*檢測模糊度 返回值為模糊度,值越大越模糊,越小越清晰,範圍在0到幾十,10以下相對較清晰,一般為5。 呼叫時可在外部設定一個閥值,具體閾值根據實際情況決定,返回值超過閥值當作是模糊圖片。 演算法所耗時間在1毫秒內 */ int VideoBlurDetect(const cv::Mat &srcimg) { cv::Mat img; cv::cvtColor(srcimg, img, CV_BGR2GRAY); // 將輸入的圖片轉為灰度圖,使用灰度圖檢測模糊度 //圖片每行位元組數及高 int width = img.cols; int height = img.rows; ushort* sobelTable = new ushort[width*height]; memset(sobelTable, 0, width*height*sizeof(ushort)); int i, j, mul; //指向影象首地址 uchar* udata = img.data; for (i = 1, mul = i*width; i < height - 1; i++, mul += width) for (j = 1; j < width - 1; j++) sobelTable[mul + j] = abs(udata[mul + j - width - 1] + 2 * udata[mul + j - 1] + udata[mul + j - 1 + width] - \ udata[mul + j + 1 - width] - 2 * udata[mul + j + 1] - udata[mul + j + width + 1]); for (i = 1, mul = i*width; i < height - 1; i++, mul += width) for (j = 1; j < width - 1; j++) if (sobelTable[mul + j] < 50 || sobelTable[mul + j] <= sobelTable[mul + j - 1] || \ sobelTable[mul + j] <= sobelTable[mul + j + 1]) sobelTable[mul + j] = 0; int totLen = 0; int totCount = 1; uchar suddenThre = 50; uchar sameThre = 3; //遍歷圖片 for (i = 1, mul = i*width; i < height - 1; i++, mul += width) { for (j = 1; j < width - 1; j++) { if (sobelTable[mul + j]) { int count = 0; uchar tmpThre = 5; uchar max = udata[mul + j] > udata[mul + j - 1] ? 0 : 1; for (int t = j; t > 0; t--) { count++; if (abs(udata[mul + t] - udata[mul + t - 1]) > suddenThre) break; if (max && udata[mul + t] > udata[mul + t - 1]) break; if (!max && udata[mul + t] < udata[mul + t - 1]) break; int tmp = 0; for (int s = t; s > 0; s--) { if (abs(udata[mul + t] - udata[mul + s]) < sameThre) { tmp++; if (tmp > tmpThre) break; } else break; } if (tmp > tmpThre) break; } max = udata[mul + j] > udata[mul + j + 1] ? 0 : 1; for (int t = j; t < width; t++) { count++; if (abs(udata[mul + t] - udata[mul + t + 1]) > suddenThre) break; if (max && udata[mul + t] > udata[mul + t + 1]) break; if (!max && udata[mul + t] < udata[mul + t + 1]) break; int tmp = 0; for (int s = t; s < width; s++) { if (abs(udata[mul + t] - udata[mul + s]) < sameThre) { tmp++; if (tmp > tmpThre) break; } else break; } if (tmp > tmpThre) break; } count--; totCount++; totLen += count; } } } //模糊度 float result = (float)totLen / totCount; delete[] sobelTable; sobelTable = NULL; return result; }