小弟的思維就是遍歷影像,用map統計出顏色直方圖,然后map按值排序,最后得到結果。總感覺這樣做很笨。有沒有大佬有別的方法
uj5u.com熱心網友回復:
沒有人嗎。。。uj5u.com熱心網友回復:
// "bmp"
void CBmpColorsDlg::OnButton1()
{
CWaitCursor wait;
CRect rect;
//
GetClientRect(&rect);
CDC *pDc = GetDC();
CDC dcMem;
dcMem.CreateCompatibleDC(pDc);
dcMem.SelectObject(&m_img);//
pDc->BitBlt(0,0,m_bmWidth,m_bmHeight,&dcMem,0,0,SRCCOPY);
//get all colors
std::vector<COLORREF> colorIndex;
for (int y = 0; y < m_bmHeight; y++)
{
for (int x = 0; x < m_bmWidth; x++)
{
COLORREF rgb = dcMem.GetPixel(x, y);
colorIndex.push_back(rgb);
}
}
//統計各種顏色數量
int Total = colorIndex.size();// m_bmHeight * m_bmWidth=253,760;
// afxDump << Total << " Total\n";
std::vector<ListData> list;
ListData temp(colorIndex[0], 0);// start from 0
list.push_back(temp);//[0]=0xFEFEFE;len=4069
// 顏色資料分析統計
int N = 1;
for (int i = 0; i < Total; i++) // if i=1;len=4068 wrong !
{// 取出每個 colorIndex[i],看是不是與 N 個 list[j].color 的一個相等
for (int j = 0; j < N; j++)
{
if (colorIndex[i] == list[j].color) // when i=0, ==
{
list[j].num++;
break;// next i
}
if (j == N - 1)
{// 如果 不相等 ,而且是 colorIndex 最后一個,則這個 colorIndex 加入到 list中
ListData temp(colorIndex[i], 1);// start from 1
list.push_back(temp);
N++ ; // 下次 for i < Total 時,多一個 list[j].color
break;// must ! otherwise ; Size != Total
}
}
}
//
CString num;
int numMax=0;
CString color;
int Size=0;
int colors=list.size();
m_ListBox.ResetContent();
for(int jj=0;jj<colors;jj++)
{
color.Format("0x%06X ",list[jj].color);
Size += list[jj].num;
if(numMax < list[jj].num ) numMax=list[jj].num;
num.Format("%d",list[jj].num);
m_ListBox.AddString(color+num);
}
color.Format("%d %d",colors-1,Size);
m_ListBox.AddString(color);
// 66843 - 66612=231
if(Size != Total ) AfxMessageBox ("Lost something ?");
TRACE1("%d",numMax);// 6215
// draw Histogram x color, y num
// double kY=200.0/numMax;
// x
//#define top 500
//#define lft 20
// pDc->MoveTo(lft,top);
// pDc->LineTo(lft+300,top);
// for(int kk=0; kk < colors ;kk++)
// {
// pDc->MoveTo(lft+kk,top);
// pDc->LineTo(lft+kk,top-(int)(list[kk].num*kY));
// }
ReleaseDC(pDc);
}
uj5u.com熱心網友回復:
回復2樓,ListData是什么?您自己定義的類嗎?我搜不到uj5u.com熱心網友回復:
見三樓回復uj5u.com熱心網友回復:
class ListData{
public:
COLORREF color;
UINT num;
ListData(COLORREF color_in, UINT num_in)
{
color = color_in;
num = num_in;
}
};
uj5u.com熱心網友回復:
多謝,我回頭自信研究研究轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/25224.html
標籤:圖形處理/算法
上一篇:求優化演算法大佬
