提前感谢您的帮助。
我有很多R& D和搜索,但我无法找到任何检测模糊图像的解决方案。
我已使用此https://github.com/BloodAxe/OpenCV-Tutorial并使用拉普拉斯公式进行模糊检测,但无法在图像中进行模糊检测
- (void)checkForBurryImage:(UIImage *)image {
cv::Mat matImage = [image toMat]; cv::Mat matImageGrey; cv::cvtColor(matImage, matImageGrey, CV_BGRA2GRAY); cv::Mat dst2 =[image toMat]; cv::Mat laplacianImage; dst2.convertTo(laplacianImage, CV_8UC1); cv::Laplacian(matImageGrey, laplacianImage, CV_8U); cv::Mat laplacianImage8bit; laplacianImage.convertTo(laplacianImage8bit, CV_8UC1); //------------------------------------------------------------- //------------------------------------------------------------- unsigned char *pixels = laplacianImage8bit.data; //------------------------------------------------------------- //------------------------------------------------------------- // unsigned char *pixels = laplacianImage8bit.data; int maxLap = -16777216; for (int i = 0; i < ( laplacianImage8bit.elemSize()*laplacianImage8bit.total()); i++) { if (pixels[i] > maxLap) maxLap = pixels[i]; } int soglia = -6118750; printf("\n maxLap : %i",maxLap); if (maxLap < soglia || maxLap == soglia) { printf("\n\n***** blur image *****"); }else printf("\nNOT a blur image"); }
我使用与Android相同的代码并且工作正常但在iOS中,它总是给我带来正面的价值所以我认为它不起作用,
所以请给我一些想法或链接或任何建议。
答案 0 :(得分:4)
使用此:
Laplacian(gray, laplacianImage, CV_64F);
Scalar mean, stddev; // 0:1st channel, 1:2nd channel and 2:3rd channel
meanStdDev(laplacianImage, mean, stddev, Mat());
double variance = stddev.val[0] * stddev.val[0];
double threshold = 2900;
if (variance <= threshold) {
// Blurry
} else {
// Not blurry
}
答案 1 :(得分:2)
使用此
-(BOOL) checkForBurryImage:(cv::Mat) matImage {// Output:(cv::Mat &) outputFrame {
cv::Mat finalImage;
cv::Mat matImageGrey;
cv::cvtColor(matImage, matImageGrey, CV_BGRA2GRAY);
matImage.release();
cv::Mat newEX;
const int MEDIAN_BLUR_FILTER_SIZE = 15; // odd number
cv::medianBlur(matImageGrey, newEX, MEDIAN_BLUR_FILTER_SIZE);
matImageGrey.release();
cv::Mat laplacianImage;
cv::Laplacian(newEX, laplacianImage, CV_8U); // CV_8U
newEX.release();
cv::Mat laplacianImage8bit;
laplacianImage.convertTo(laplacianImage8bit, CV_8UC1);
laplacianImage.release();
cv::cvtColor(laplacianImage8bit,finalImage,CV_GRAY2BGRA);
laplacianImage8bit.release();
int rows = finalImage.rows;
int cols= finalImage.cols;
char *pixels = reinterpret_cast<char *>( finalImage.data);
int maxLap = -16777216;
for (int i = 0; i < (rows*cols); i++) {
if (pixels[i] > maxLap)
maxLap = pixels[i];
}
int soglia = -6118750;
pixels=NULL;
finalImage.release();
BOOL isBlur = (maxLap < kBlurThreshhold)? YES : NO;
return isBlur;
}
答案 2 :(得分:1)
以下方法使用 OpenCV :
- (BOOL) isImageBlurry:(UIImage *) image {
// converting UIImage to OpenCV format - Mat
cv::Mat matImage = [self convertUIImageToCVMat:image];
cv::Mat matImageGrey;
// converting image's color space (RGB) to grayscale
cv::cvtColor(matImage, matImageGrey, CV_BGR2GRAY);
cv::Mat dst2 = [self convertUIImageToCVMat:image];
cv::Mat laplacianImage;
dst2.convertTo(laplacianImage, CV_8UC1);
// applying Laplacian operator to the image
cv::Laplacian(matImageGrey, laplacianImage, CV_8U);
cv::Mat laplacianImage8bit;
laplacianImage.convertTo(laplacianImage8bit, CV_8UC1);
unsigned char *pixels = laplacianImage8bit.data;
// 16777216 = 256*256*256
int maxLap = -16777216;
for (int i = 0; i < ( laplacianImage8bit.elemSize()*laplacianImage8bit.total()); i++) {
if (pixels[i] > maxLap) {
maxLap = pixels[i];
}
}
// one of the main parameters here: threshold sets the sensitivity for the blur check
// smaller number = less sensitive; default = 180
int threshold = 100;
return (maxLap <= threshold);
}
将 UIImage
转换为 OpenCV::Mat
- (cv::Mat)convertUIImageToCVMat:(UIImage *)image {
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
cvMat.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
CGContextRelease(contextRef);
return cvMat;
}
答案 3 :(得分:0)
尝试Is there a way to detect if an image is blurry?
并阅读:http://www.cs.cmu.edu/~htong/pdf/ICME04_tong.pdf。
基本上,如果图像中的高频成分不多,则模糊不清。