我是Matlab的新手,所以这应该是一个简单的问题。我有一个带有一些特定像素的图像,我需要从中获取红色RGB分量,求和它们,并将结果存储到变量中。默认情况下,这些值的类型为uint8,因此总和不能超过255.我尝试使用double()的每个组合将R值转换为double,但似乎没有任何效果。以下是从终端复制的确切内容:(所有像素的R值均高于200)
img = imread('img.png');
r = img(64,64,1)
r =
224
r = r + double(img(64,65,1))
r =
255
r = r + double(img(64,66,1))
r =
255
我做错了什么?我无法将这些值转换为双倍?
答案 0 :(得分:1)
对于图像处理,大多数时候最好使用public static int baseB2int(String number, int base)
{
int product = 0;
int num = Integer.parseInt(number);
int sum;
int i = number.length();
int[] theNumber = new int[i];
for (int j = 0; j < number.length(); j++)
{
System.out.println("the length of number is " + number.length());
theNumber[j] = num%base;
System.out.println("theNumber["+j+"] is " + theNumber[j]);
num = num/base;
System.out.println("the num is "+num);
}
sum = theNumber[i - 1];
System.out.println("the sum is " + sum);
while (i > 0)
{
product = sum * base;
System.out.println("The product in the while loop is " + product);
System.out.println("theNumber[previous]" + theNumber[i-1]);
sum = product + theNumber[i-1];
System.out.println("the sum in the while loop is " + sum);
i--;
}
return product;
}
函数将读取的图像转换为0-1之间的双数组:
im2double
然后,您不必再担心同一程序中的数据类型。
单独使用img = im2double(imread('img.png'));
的数据类型转换几乎从不执行您想要的图像,因为uint8和双图像在 数据类型和数据范围方面都不同。
答案 1 :(得分:0)
r = r + double(img(64,65,1))
行中发生的事情是img(64,65,1)
值正在转换为double
,但随后会立即转换回class(r)
,因为r
是一个整数类,在操作中具有优先权。请注意class(int64(10)+10)
返回int64
。正如烧杯评论的那样,此处的关键是首先将r
本身转换为double
。
您可能不必担心使用double()
进行转换;双精度可以表示高达2^53-1
的整数,高于255.因此,如果您只是进行简单的像素求和操作或类似的操作,那么您不会在计算中失去任何精度。当然,如果你需要将它放回图像中,那么大约255的任何东西都会饱和。因此,根据您正在做的事情将事物重新调整为0到1之间,它可能更有意义;在这种情况下,正如Mingjing建议的那样,最好使用im2double
。