Mac中opencv批量对图片进行二值化

对灰度图像进行二值化,传入的图片是手写汉字的截图,通过二值化把字的部分提出来。用ostu进行二值化

#include <stdio.h>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
#include<stack>
using namespace std;
using namespace cv;
#include <fstream>

#include <sys/uio.h>
#include <dirent.h>



int main()
{
    
    struct dirent *dirp;
    DIR* dir = opendir("/Users/tanchao/Documents/c++work/myopencv5/myopencv5/image");
    
    //int blockSize = 25;
    //int constValue = 10;
    while ((dirp = readdir(dir)) != nullptr)
    {
        if (dirp->d_type == DT_REG &&string(dirp->d_name)!=".DS_Store")//.DS_Store是Mac中隐藏文件,记录这个文件夹的属性,所以我们要跳过这个文件
        {
            Mat g_srcImage;
            g_srcImage = imread("/Users/tanchao/Documents/c++work/myopencv5/myopencv5/image/"+string(dirp->d_name),0);//第二个参数0表示灰度图读取
            //imshow("test",g_srcImage);
            Mat changeMat = Mat::zeros(cv::Size(g_srcImage.cols, g_srcImage.rows), CV_8UC1);//修改之后的图片
            for(int i=0;i<g_srcImage.rows;i++)
            {
                for(int j=0;j<g_srcImage.cols;j++)
                {
            
                    //if(int(g_srcImage.at<uchar>(i,j))>150)
                        //changeMat.ptr<uchar>(i)[j] = 255;
                    //else
                        //changeMat.ptr<uchar>(i)[j] = int(g_srcImage.at<uchar>(i,j));
                    //cout<<int(g_srcImage.at<uchar>(i,j))<<" ";
                    //adaptiveThreshold(g_srcImage, changeMat, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);

                    threshold(g_srcImage, changeMat, 0, 255, CV_THRESH_OTSU);
            
                }
                //cout << "
"<<endl;
            }
            cout<<"/Users/tanchao/Documents/c++work/myopencv5/myopencv5/change/"+string(dirp->d_name)<<endl;
            imwrite("/Users/tanchao/Documents/c++work/myopencv5/myopencv5/quanjuyuzhi/"+string(dirp->d_name),changeMat);//加了用来截图
        }
    }
    closedir(dir);
    waitKey(0);
    return 0;
    
}

其实也可以用自适应二值化和自己设定阈值进行二值化,具体的可以根据代码中注释部分进行修改。

原文地址:https://www.cnblogs.com/shixisheng/p/9233940.html