码迷,mamicode.com
首页 > 其他好文 > 详细

保存·

时间:2014-07-04 00:03:00      阅读:452      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   width   os   for   

#include<iostream>
#include<string>
#include<list>
#include<vector>
#include<map>
#include<stack>
#include <opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>

typedef unsigned char byte;
void GetImgD_SIO(IplImage *src,byte *imagedata)
{
    if (src->nChannels!=1)
    {
        return;
    }
    int width=src->width;
    int height=src->height;
    for(int i=0;i<height;i++)
    {
        for (int j=0;j<width;j++)
        {
            imagedata[i*width+j]=src->imageData[i*src->widthStep+j];
        }
    }
}
void SetImgD_SIO(IplImage *src,byte *imagedata)
{
    int width=src->width;
    int height=src->height;
    for(int i=0;i<height;i++)
    {
        for (int j=0;j<width;j++)
        {
            src->imageData[i*src->widthStep+j]=imagedata[i*width+j];
        }
    }
}
int GetTwoValueT(byte *image,int width,int height)
{
    int Hdata[256];
    memset(Hdata,0,256*sizeof(int));
    int minPixel=255;
    int maxPixel=0;
    int T=0;
    int TT=0;
    for (int i=0;i<height;i++)
    {
        for (int j=0;j<width;j++)
        {
            Hdata[image[i*width+j]]++;
            if (minPixel>image[i*width+j])
            {
                minPixel=image[i*width+j];
            }
            if (maxPixel<image[i*width+j])
            {
                maxPixel=image[i*width+j];
            }
        }
    }
    long IP1,IP2,SP1,SP2;
    int MeanG1=0;
    int MeanG2=0;
    double w0,w1;
    double G,tmpG;
    G=0;
    tmpG=0;
    for (int i=minPixel;i<=maxPixel;i++)
    {
        T=i;
        IP1=0;
        IP2=0;
        SP1=0;
        SP2=0;
        for (int j=minPixel;j<=T;j++)
        {
            IP1+=Hdata[j]*j;
            SP1+=Hdata[j];
        }
        if (SP1!=0)
        {
            MeanG1=IP1/SP1;
        }
        else
        {
            MeanG1=0;
        }
        w0=(double)SP1/(double)(width*height);
        for (int j=T+1;j<=maxPixel;j++)
        {
            IP2+=Hdata[j]*j;
            SP2+=Hdata[j];
        }
        if (SP2!=0)
        {
            MeanG2=IP2/SP2;
        }
        else
        {
            MeanG2=0;
        }
        w1=1-w0;
        G=(double)((w0*w1)*(MeanG1-MeanG2)*(MeanG1-MeanG2));
        if (G>tmpG)
        {
            tmpG=G;
            TT=T;
        }
    }
    return TT;
}
void TwoValue(byte *imagedata,int width,int height,int T)
{
    for(int i=0;i<height;i++)
    {
        for (int j=0;j<width;j++)
        {
            int tmp=imagedata[i*width+j];
            imagedata[i*width+j]=tmp>T?0:255;
        }
    }
}
void icvprCcaByTwoPass(const cv::Mat&  _binImg,cv::Mat& _lableImg)
{
    if(_binImg.empty()||_binImg.type()!=CV_8UC1)
    {
        return ;
    }
    //first pass
    _lableImg.release();
    _binImg.convertTo(_lableImg,CV_32SC1);

    int label=1;
    std::vector<int>labelSet;
    labelSet.push_back(0);
    labelSet.push_back(1);

    int rows=_binImg.rows-1;
    int cols=_binImg.cols-1;

    for(int i=1;i<rows;i++)
    {
        int *data_preRow=_lableImg.ptr<int>(i-1);
        int *data_curRow=_lableImg.ptr<int>(i);
        for(int j=1;j<cols;j++)
        {
            if(data_curRow[j]==1)
            {
                std::vector<int>  neighborLabels;
                neighborLabels.reserve(2);
                int leftPixel=data_curRow[j-1];
                int upPixel=data_preRow[j];
                if(leftPixel>1)
                {
                    neighborLabels.push_back(leftPixel);
                }
                if (upPixel > 1)
                {
                    neighborLabels.push_back(upPixel) ;
                }
                if (neighborLabels.empty())
                {
                    labelSet.push_back(++label) ; 
                    data_curRow[j] = label ;
                    labelSet[label] = label ;
                }
                else
                {
                    std::sort(neighborLabels.begin(), neighborLabels.end()) ;
                    int smallestLabel = neighborLabels[0] ;  
                    data_curRow[j] = smallestLabel ;
 
                    // save equivalence
                    for (size_t k = 1; k < neighborLabels.size(); k++)
                    {
                        int tempLabel = neighborLabels[k] ;
                        int& oldSmallestLabel = labelSet[tempLabel] ;
                        if (oldSmallestLabel > smallestLabel)
                        {                           
                            labelSet[oldSmallestLabel] = smallestLabel ;
                            oldSmallestLabel = smallestLabel ;
                        }                       
                        else if (oldSmallestLabel < smallestLabel)
                        {
                            labelSet[smallestLabel] = oldSmallestLabel ;
                        }
                    }
                }      
            }
        }
    }
    for (size_t i = 2; i < labelSet.size(); i++)
    {
        int curLabel = labelSet[i] ;
        int preLabel = labelSet[curLabel] ;
        while (preLabel != curLabel)
        {
            curLabel = preLabel ;
            preLabel = labelSet[preLabel] ;
        }
        labelSet[i] = curLabel ;
    }
    for (int i = 0; i < rows; i++)
    {
        int* data = _lableImg.ptr<int>(i) ;
        for (int j = 0; j < cols; j++)
        {
            int& pixelLabel = data[j] ;
            pixelLabel = labelSet[pixelLabel] ; 
        }
    }
}
cv::Scalar icvprGetRandomColor()
{
    uchar r = 255 * (rand()/(1.0 + RAND_MAX));
    uchar g = 255 * (rand()/(1.0 + RAND_MAX));
    uchar b = 255 * (rand()/(1.0 + RAND_MAX));
    return cv::Scalar(b,g,r) ;
}
void icvprLabelColor(const cv::Mat& _labelImg, cv::Mat& _colorLabelImg) 
{
    if (_labelImg.empty() ||
        _labelImg.type() != CV_32SC1)
    {
        return ;
    }
 
    std::map<int, cv::Scalar> colors ;
 
    int rows = _labelImg.rows ;
    int cols = _labelImg.cols ;
 
    _colorLabelImg.release() ;
    _colorLabelImg.create(rows, cols, CV_8UC3) ;
    _colorLabelImg = cv::Scalar::all(0) ;
 
    for (int i = 0; i < rows; i++)
    {
        const int* data_src = (int*)_labelImg.ptr<int>(i) ;
        uchar* data_dst = _colorLabelImg.ptr<uchar>(i) ;
        for (int j = 0; j < cols; j++)
        {
            int pixelValue = data_src[j] ;
            if (pixelValue > 1)
            {
                if (colors.count(pixelValue) <= 0)
                {
                    colors[pixelValue] = icvprGetRandomColor() ;
                }
                cv::Scalar color = colors[pixelValue] ;
                *data_dst++ = color[0] ;
                *data_dst++ = color[1] ;
                *data_dst++ = color[2] ;
            }
            else
            {
                data_dst++ ;
                data_dst++ ;
                data_dst++ ;
            }
        }
    }
}
int main(int argc,char **argv)
{
    IplImage* img1 = cvLoadImage("E:/newocr/ocr/big.jpg", 1);
    int width=img1->width;
    int height=img1->height;
    std::cout<<width<<"  "<<height<<std::endl;
    byte *imagedata=new byte[width*height];
    GetImgD_SIO(img1,imagedata);
    int T=GetTwoValueT(imagedata,width,height);
    std::cout<<T<<std::endl;
    TwoValue(imagedata,width,height,T);
    for (int i=0;i<height;i++)
    {
        for (int j=0;j<width;j++)
        {
            if (imagedata[i*width+j]==255)
            {
                imagedata[i*width+j]=1;
            }
        }
    }
    SetImgD_SIO(img1,imagedata);
    cv::Mat binImage(img1);
    cv::imshow("test1",binImage);
    //cv::Mat binImage = cv::imread("E:/newocr/ocr/big.jpg", 0) ;
    //cv::imshow("test",binImage);
    //cv::threshold(binImage,binImage,50,1,CV_THRESH_BINARY_INV);
    
    /*
    cv::Mat  labelImg;
    icvprCcaByTwoPass(binImage,labelImg);
    //cv::imshow("test1",binImage);
    //cv::imshow("test2",labelImg);
    cv::Mat grayImg ;
    labelImg *= 10 ;
    labelImg.convertTo(grayImg, CV_8UC1) ;
    cv::imshow("labelImg", grayImg) ;
 
    cv::Mat colorLabelImg ;
    icvprLabelColor(labelImg, colorLabelImg) ;
    cv::imshow("colorImg", colorLabelImg) ;*/
    cv::waitKey(0);
    
}

 

保存·,布布扣,bubuko.com

保存·

标签:style   blog   color   width   os   for   

原文地址:http://www.cnblogs.com/fandaojian/p/3823325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!