Image processing 在两个值之间缩放数字
如果给我一个浮点数,但事先不知道该数字将在什么范围内,是否可以以某种有意义的方式将该数字缩放到另一个范围内?我正在考虑检查数字是否在0范围内。如果不知道范围,则无法缩放范围内的数字 也许你要找的是模运算符。模基本上是除法的余数,大多数语言中的运算符是isImage 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 % 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
!(即只保留小数点后的数字)