ImgprocessUtils.java 文件源码

java
阅读 32 收藏 0 点赞 0 评论 0

项目:classchecks 作者:
/**
 * 其主要思路为:
    1、求取源图I的平均灰度,并记录rows和cols;
    2、按照一定大小,分为N*M个方块,求出每块的平均值,得到子块的亮度矩阵D;
    3、用矩阵D的每个元素减去源图的平均灰度,得到子块的亮度差值矩阵E;
    4、用双立方差值法,将矩阵E差值成与源图一样大小的亮度分布矩阵R;
    5、得到矫正后的图像result=I-R;
* @Title: unevenLightCompensate 
* @Description: 光线补偿 
* @param image
* @param blockSize
* void 
* @throws
 */
public static void unevenLightCompensate(Mat image, int blockSize) {
    if(image.channels() == 3) {
        Imgproc.cvtColor(image, image, 7);
    }
    double average = Core.mean(image).val[0];
    Scalar scalar = new Scalar(average);
    int rowsNew = (int) Math.ceil((double)image.rows() / (double)blockSize);
    int colsNew = (int) Math.ceil((double)image.cols() / (double)blockSize);
    Mat blockImage = new Mat();
    blockImage = Mat.zeros(rowsNew, colsNew, CvType.CV_32FC1);
    for(int i = 0; i < rowsNew; i ++) {
        for(int j = 0; j < colsNew; j ++) {
            int rowmin = i * blockSize;
            int rowmax = (i + 1) * blockSize;
            if(rowmax > image.rows()) rowmax = image.rows();
            int colmin = j * blockSize;
            int colmax = (j +1) * blockSize;
            if(colmax > image.cols()) colmax = image.cols();
            Range rangeRow = new Range(rowmin, rowmax);
            Range rangeCol = new Range(colmin, colmax);
            Mat imageROI = new Mat(image, rangeRow, rangeCol);
            double temaver = Core.mean(imageROI).val[0];
            blockImage.put(i, j, temaver);
        }
    }

    Core.subtract(blockImage, scalar, blockImage);
    Mat blockImage2 = new Mat();
    int INTER_CUBIC = 2;
    Imgproc.resize(blockImage, blockImage2, image.size(), 0, 0, INTER_CUBIC);
    Mat image2 = new Mat();
    image.convertTo(image2, CvType.CV_32FC1);
    Mat dst = new Mat();
    Core.subtract(image2, blockImage2, dst);
    dst.convertTo(image, CvType.CV_8UC1);
}
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号