ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

手工局部二值化,MFC, BMP

2022-07-26 19:06:58  阅读:138  来源: 互联网

标签:MFC bytesPerLine int pData unsigned char BMP DataLen 二值化


拿知乎上的一张图练练手,光照是斜对角,全局二值化阈值20,一个角太白;改为全局80,另一个角太黑。

就把图分成4x4,16个小方块,用一个阈值矩阵手工搞,虽说是滥竽充数,好歹也弄出来了。

 

 

 

程序段:

void CXDTS1View::OnTestTest1()
{
    // TODO: Add your command handler code here
    CXDTDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    unsigned char* pData;
    int            DataLen;

    
    //pData = (unsigned char*)pDoc->m_Data;
    DataLen = pDoc->m_DataLen;
    if (DataLen == 0) return;

    pData = new unsigned char[DataLen];
    
    memcpy(pData, (void*)pDoc->m_Data, DataLen);


    //if (DataLen > 10000) DataLen = 10000;

    BITMAPFILEHEADER hdr;
    LPBITMAPINFOHEADER lpbi;
    BITMAPINFOHEADER  bmpInfo;//信息头  

    memcpy(&hdr, pData, 14);
    memcpy(&bmpInfo, pData + 14, 40);


    unsigned char* p = NULL;
    unsigned char* pBmpdata = NULL;
    unsigned char* pBmpdata2 = NULL;
    p = (unsigned char*)pData + 14;
    pBmpdata = (unsigned char*)(pData + hdr.bfOffBits);
    pBmpdata2 = (unsigned char*)(pData + hdr.bfOffBits);
    lpbi = (LPBITMAPINFOHEADER)(p);
    /*PRINT("%d-%d-%d", hdr.bfType, hdr.bfSize, hdr.bfOffBits);
    PRINT("%d-%d-%d", lpbi->biSize, lpbi->biWidth, lpbi->biHeight);
    PRINT("%d-%d-%d", bmpInfo.biSize, bmpInfo.biWidth, bmpInfo.biHeight);*/

    int bfWidth, bfHeight;
    int biBitCount;
    int bytesPerLine;
    int skip;
    int imageSize;

    //DBI 数据信息
    bfWidth = lpbi->biWidth;
    bfHeight = lpbi->biHeight;
    biBitCount = lpbi->biBitCount;

    
    //内存数据映射
    bytesPerLine = ((bfWidth * biBitCount + 31) >> 5) << 2;//bfWidth *3+skip
    skip = 4 - ((bfWidth * biBitCount) >> 3) & 3;
    imageSize = bytesPerLine * bfHeight;

    PRINT("BMP W:%d-H:%d-b:%d  MEM: BpL:%d-Skip:%d-Size:%d", 
        bfWidth, bfHeight, biBitCount,
        bytesPerLine, skip, imageSize);


    CMainFrame* pMainFrame = (CMainFrame*)((CXDTApp*)AfxGetApp())->m_pMainWnd;
    CPropertiesWnd* pwndProperties = &(pMainFrame->m_wndProperties);

    CString str = pwndProperties->m_pSize->GetSubItem(0)->FormatProperty();
    int  door;
    door = atoi(str.GetBuffer());
    

    int R, G, B, Gray;
    
    //door = 80;
    
    int tdoor[4][4] =
    {
        50, 60, 70, 80,
        40, 50, 60, 70,
        30, 40, 50, 60,
        20, 30, 40, 50 
    };
    
    //处理内存数据
    for (int i = 0; i < bfHeight; i++) //高度是反的
    {
        for (int j = 0; j < bytesPerLine; j+=3)  //宽度 转换为 行(列数) 
        {
                
            B=pBmpdata[i * bytesPerLine + j] ;
            G=pBmpdata[i * bytesPerLine + j+1];
            R=pBmpdata[i * bytesPerLine + j+2];

            Gray = (R * 19595 + G * 38469 + B * 7472) >> 16;

            door = tdoor[i * 4 / bfHeight][j * 4 / bytesPerLine];

            if (Gray > door) Gray = 255;
            else  Gray = 0;

            pBmpdata[i * bytesPerLine + j] = Gray;
            pBmpdata[i * bytesPerLine + j+1] = Gray;
            pBmpdata[i * bytesPerLine + j+2] = Gray;
            
        }
    }
    
    
    //pDoc->UpdateAllViews(NULL);
    ShowBMP(pData, DataLen);
    
    delete pData;

}

 

标签:MFC,bytesPerLine,int,pData,unsigned,char,BMP,DataLen,二值化
来源: https://www.cnblogs.com/xgz21/p/16522155.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有