OpenGL を使用して RGB 画像のヒストグラムをプロットしています。これは 8 ビットの画像ヒストグラムであるため、データセットには 0 から 255 までのデータ ポイントが含まれています。
glScaled() を使用せずにヒストグラムをプロットすると、グラフは期待どおりにプロットされますが、もちろん、割り当てられた領域を埋めません (幅は可変、高さは定数)。ただし、glScaled() を使用すると、グラフに奇妙なアーティファクトが表示されます。
問題の例を確認するには、次の画像を参照してください。
上の画像は、glScaled() でスケーリングせずに 256 データ ポイントでプロットしたヒストグラムを示しています。
上の 2 つの画像は、256 のデータ ポイントでプロットされ、glScaled() でスケーリングされたヒストグラムを示しています。奇妙なアーティファクトは明らかです (データが欠落していますか?)。3 番目のヒストグラムは、光のレベルが変化するため、形状がわずかに異なることに注意してください。
私のOpenGL初期化コードの関連部分は次のとおりです。
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, width, height, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// If this line is removed then the graph plots correctly
// m_scale_factor = width / 256
glScaled(m_scale_factor, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
そして、ここに私のプロットコードの関連部分があります:
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
glBegin(GL_LINE_STRIP);
for (int n = 0; n < m_histogram_X; n++)
{
glColor4ub(255, 0, 0, 255);
glVertex2i(n, m_Hist_Channel_R[n]);
glVertex2i(n, GRAPH_HEIGHT);
glColor4ub(0, 255, 0, 255);
glVertex2i(n, m_Hist_Channel_G[n]);
glVertex2i(n, GRAPH_HEIGHT);
glColor4ub(0, 0, 255, 255);
glVertex2i(n, m_Hist_Channel_B[n]);
glVertex2i(n, GRAPH_HEIGHT);
}
glEnd()
...
この段階で、私は OpenGL を初めて使用することを述べなければならないと感じているので、多くの OpenGL のことを誤解している可能性があります...
私の質問は: OpenGL でこの問題を修正することは可能ですか、それとも何らかの補間によってデータ ポイントの数を増やし、スケーリングせずにプロットする必要がありますか?
提供されたヘルプに感謝します。