-3

我需要为我正在处理的项目绘制一个简单的直方图,需要看这个......

直方图

我知道必须在我的 H[] 数组上运行一些简单的 for 循环,其中包含属于每个灰度值的像素数......所以在 H[] 中,我们可以说“灰度值中的 10 个像素1" 所以在 1 处会有一条长度为 10 的线在我的图像旁边垂直...

如果有人可以提供帮助,我将不胜感激!

谢谢。

写了这个,但它太大了,而且因为某种原因颠倒了,而且倾斜了。

         if (H != null) {
                    int width = getWidth();
                    int height = getHeight();           
                    int HhPos = (width - (width/2));
                    int HvPos = (height - (height));
                  for(int i = 0 ; i <255 ; i++){
                     g.drawRect(i+HhPos, i+HvPos, 1, H[i]);


                   }
4

2 回答 2

0

您正在绘制具有 x 和 y 值的点。您正在绘制一个以像素为单位的宽度和高度的直方图。

例如,假设您的直方图宽度为 500 像素,高度为 300 像素。

您遍历数据点一次,寻找最小 x、最小 y、最大 x 和最大 y。

假设我们正在绘制 Y 点(X 轴是宽度),则从最大 x 中减去最小 x。将 500 像素(宽度)除以差值,即可得到每个 x 值的像素数。这个数字可以大于一,因此每个 x 值有多个像素。这个数字可以小于一,因此您拥有的数据值比像素多。

width pixels per value = width of histogram in pixels / difference in X points

你对 Y 轴做同样的事情。计算每个 y 值的像素。

height pixels per value = height of histogram in pixels / difference in y points

现在,您再次检查数据点。对于每个数据点,您可以根据数据点的 x 和 y 值计算宽度和高度(以像素为单位)。您使用宽度和高度的每个值的像素数进行转换。

width = x value * width pixels per value

height = y value * height pixels per value

您使用 JavaGraphics drawLinedrawRect方法在直方图中绘制线条或条形。请记住,Java 图形中的 Y 维度会下降,而不是像直方图中那样上升。绘图时必须考虑到这一点。

于 2012-09-21T18:33:49.330 回答
0

正如吉尔伯特所说,您需要标准化您的值,以确定最大范围或上限。

然后,您可以从中确定给定值与最大值相比的百分比,然后根据可用高度将其绘制在图表上。

(取自这个问题的上一个答案

// Determine the maximum vertical value...
int maxValue = 0;

for (Integer key : mapHistory.keySet()) {
    int value = mapHistory.get(key);
    maxValue = Math.max(maxValue, value);
}

int xPos = xOffset;

for (Integer key : mapHistory.keySet()) {
    int value = mapHistory.get(key);
    // Calculate the percentage that the given value uses compared to that of the
    // maximum value
    float percentage = (float)value / (float)maxValue;
    // Calculate the line height based on the available vertical space...
    int barHeight = Math.round(percentage * height);
    g2d.setColor(new Color(key, key, key));

    int yPos = height + yOffset - barHeight;
    Rectangle2D bar = new Rectangle2D.Float(xPos, yPos, barWidth, barHeight);

    g2d.fill(bar);
    g2d.setColor(Color.DARK_GRAY);
    g2d.draw(bar);

    xPos += barWidth;
}

现在在前面的示例中,我使用Mapto 来存储值,但是用您的数据数组替换它应该相对容易......

for (Integer key : mapHistory.keySet())会成为for (int key : H)

此外,Graphics.drawLine它是从一个点到另一个点画一条线,而不是从一个点到宽度/高度值(比如说Graphics.drawRectangle

于 2012-09-21T21:51:06.970 回答