Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 在两个值之间缩放数字_Image Processing_Scaling - Fatal编程技术网

Image processing 在两个值之间缩放数字

Image processing 在两个值之间缩放数字,image-processing,scaling,Image Processing,Scaling,如果给我一个浮点数,但事先不知道该数字将在什么范围内,是否可以以某种有意义的方式将该数字缩放到另一个范围内?我正在考虑检查数字是否在0范围内。如果不知道范围,则无法缩放范围内的数字 也许你要找的是模运算符。模基本上是除法的余数,大多数语言中的运算符是is% 0 % 5 == 0 1 % 5 == 1 2 % 5 == 2 3 % 5 == 3 4 % 5 == 4 5 % 5 == 0 6 % 5 == 1 7 % 5 == 2 ... 当然不可能。可以定义范围并忽略所有外部值。或者,您可以收

如果给我一个浮点数,但事先不知道该数字将在什么范围内,是否可以以某种有意义的方式将该数字缩放到另一个范围内?我正在考虑检查数字是否在0范围内。如果不知道范围,则无法缩放范围内的数字

也许你要找的是模运算符。模基本上是除法的余数,大多数语言中的运算符是is
%

0 % 5 == 0
1 % 5 == 1
2 % 5 == 2
3 % 5 == 3
4 % 5 == 4
5 % 5 == 0
6 % 5 == 1
7 % 5 == 2
...

当然不可能。可以定义范围并忽略所有外部值。或者,您可以收集统计信息以在运行时查找范围(即通过直方图分析)


它真的是关于图像处理吗?图像分割领域有很多相关问题。

您想将单个随机浮点数缩放到0到1之间,但不知道数字的范围

99.001的比例应该是多少?如果随机数的范围是[99100],那么我们的缩放数应该非常接近于0。如果随机数的范围是[01100],那么我们的缩放数应该非常接近1


在现实世界中,您总是有一些关于范围的信息(范围本身或范围的宽度)。如果没有进一步的信息,答案是“不,不行。”

我认为你能做的最好的事情是这样的:

int scale(x) {
    if (x < -1) return 1 / x - 2;
    if (x > 1) return 2 - 1 / x;
    return x;
}
int刻度(x){
如果(x<-1)返回1/x-2;
如果(x>1)返回2-1/x;
返回x;
}

这个函数是单调的,它的范围是-2到2,但它不是严格意义上的缩放。

我假设您有一些二维测量的结果,并且希望以彩色或灰度显示它们。为此,我首先要找到最大值和最小值,然后在这两个值之间进行缩放

static double[][] scale(double[][] in, double outMin, double outMax) {
  double inMin = Double.POSITIVE_INFINITY;
  double inMax = Double.NEGATIVE_INFINITY;

  for (double[] inRow : in) {
    for (double d : inRow) {
      if (d < inMin)
        inMin = d;
      if (d > inMax)
        inMax = d;
    }
  }

  double inRange = inMax - inMin;
  double outRange = outMax - outMin;

  double[][] out = new double[in.length][in[0].length];
  for (double[] inRow : in) {
    double[] outRow = new double[inRow.length];
    for (int j = 0; j < inRow.length; j++) {
      double normalized = (inRow[j] - inMin) / inRange; // 0 .. 1
      outRow[j] = outMin + normalized * outRange;
    }
  }
  return out;
}
静态双[][]比例(双[][]英寸,双输出最小值,双输出最大值){
double in min=double.正无穷大;
double inMax=double.NEGATIVE_无穷大;
用于(双[]英寸:英寸){
用于(双d:输入){
如果(dinMax)
inMax=d;
}
}
双inRange=inMax-inMin;
双重超出范围=超出最大值-超出最小值;
double[]out=新的双精度[in.length][in[0.length];
用于(双[]英寸:英寸){
double[]outRow=新的double[inRow.length];
对于(intj=0;j

这段代码未经测试,只是显示了一般的想法。它进一步假设您的所有输入数据都在“合理”范围内,远离无穷大,并且没有指定的问题解决方案。我在想一个10亿以下的数字,你会把它扩展到什么?如果数字是12,你的答案会改变吗?为什么你不知道范围?你在干什么?关键词是“有意义”。如果没有额外的背景,我想答案是“不”。你想解决的实际问题是什么?回想起来,这是一个非常愚蠢的问题。我认为模除法对我来说很好。也许这会帮助其他无知的程序员。模除法只有在假设范围的宽度>=模。。。但是,如果我们要做出这样的假设,您最好使用
n-(int)n
!(即只保留小数点后的数字)