使用Java识别图形中的线条

使用Java识别图形中的线条,java,image,Java,Image,我正在研究一个想法,其中我必须识别JPG或PNG文件中的行。PNG文件包含一个单一值的图形-一个x,y组合。例如,图形看起来像Y=mx+c。 我想确定图形中的线条-如果我可以确定像素在帧中的位置,我相信我可以得到用于绘制图形的值(x,y)。这里的假设是-我知道比例,即1像素=Y的什么单位? 有人能帮我写一个代码,在一个PNG文件中识别特定颜色的像素吗 编辑 让我们举个例子来说明这一点。假设我有一组数据值X和Y,如下所示- X = 1, Y = 10 X = 2, Y = 20 X = 3, Y

我正在研究一个想法,其中我必须识别JPG或PNG文件中的行。PNG文件包含一个单一值的图形-一个x,y组合。例如,图形看起来像Y=mx+c。 我想确定图形中的线条-如果我可以确定像素在帧中的位置,我相信我可以得到用于绘制图形的值(x,y)。这里的假设是-我知道比例,即1像素=Y的什么单位? 有人能帮我写一个代码,在一个PNG文件中识别特定颜色的像素吗

编辑

让我们举个例子来说明这一点。假设我有一组数据值X和Y,如下所示-

X = 1, Y = 10
X = 2, Y = 20
X = 3, Y = 30
X = 4, Y = 40
X = 5, Y = 50
X = 6, Y = 60
在这种情况下,如果我使用jfreechart类型的图表工具并制作一张图表,它会像一条直线一样使用工具

因此,输入是数据集,输出是.PNG文件(使用jchart或jfreechart),其中包含Y值的折线图

问题是——如果我们逆转流程,我们能否开发一个程序,将PNG文件(包含图形)返回给我数据集


问题的背景是——我想在我的应用程序中存储PNG文件,而不是原始数据集。但是如果有一个PNG文件,我应该能够取回我的数据集。

一般来说,在计算机显示器上没有中央
(0,0)
点,因为该点被定义为屏幕的左上角。因此,如果我们查看函数
f(x)=ax+b
,则
b
参数定义为
y
函数在
x=0
处的值,表示屏幕的左边框。因此,准确定义要抵消的内容非常重要


要找到斜率,只需在屏幕上取一个中心点,你知道你有一个函数点,向左或向右移动
x
像素,找到
y
高度增量,
y/x
是函数斜率,或者前面提到的函数中的参数
a

我读对了吗:在空白画布上有一行图像?如果是这样的话,你只需向下看最左边的像素列,找到不同的像素,然后向右看一列,找到那里的像素。现在你有两点,从两点生成一个线性函数很简单。作为一个整体,为什么不使用像素呢?

我有点困惑,你的问题是仅仅确定图像中像素的颜色,还是问题是你试图做什么的数学问题

对于前者,请执行以下操作:

    BufferedImage bimg = ImageIO.read(new File("whatever.png"));

    // get the colour of the pixel at position (x, y)
    int col = bimg.getRGB(x, y);

    // decode red, green and blue components of colour if necessary
    int r = (col >> 16) & 0xff;
    int g = (col >> 8) & 0xff;
    int b = col & 0xff;
如果您只想从图形中获取数据集(即,不从该数据中导出方程式),则基本上可以循环遍历每个X位置,并找到Y位置,其中有图形打印程序使用的颜色像素。如果图形具有轴、抗锯齿等,则任务将更加复杂

从数据中导出方程的任务可能要复杂得多,但您可以从检查某些可疑公式开始,如您提到的y=mx+c。例如,您可以循环检查最后一次的每个Y位置之间的差异;如果这个差总是一样的,那么你就得到了一个直线图(在这一点上,推导公式应该很简单)


对于其他方程的测试,了解一点微积分会有所帮助。然后,一个出发点是看差值中的差值是否匹配所讨论方程的导数。(举个例子,如果方程是y=ax^2+c,那么X的每增加一次,y的增加量本身就会增加2a。)

我不确定你的项目达到了什么程度,但我也需要检测图像中的线条。这就是帮助我的原因。

您是否试图破坏某些验证码?:假设你的意思是你可以得到函数f(x)=ax+b的参数a和b???嗯?当然有b,这是线与图像左边框相交的y坐标。谢谢Harleqin,你答对了。我从未使用过任何Java图像代码,所以我想知道如何对其进行编码或为其编写正确的类?