gpt4 book ai didi

c++ - jpeg 和 tiff 像素值提取

转载 作者:行者123 更新时间:2023-11-28 08:01:05 32 4
gpt4 key购买 nike

我希望能够比较 2 张图像(相同格式)并对这些图像执行位级别比较。 1)为标题创建结构。2)打开文件并从 SOI 标记的图像数据偏移量开始读取内容。3)将相应的值存储在 3d 数组或 vector 数组中。4)进行元素明智的比较和返回一个结果。我已经成功地使用 fread() 为 bmp 执行此操作,并使用 3d 数组作为容器,其中包含可以分配和释放内存的方法。(但 bmp 是未压缩的图像)。不知何故,这个过程对于 jpeg 和 tiff 来说似乎要困难得多。即使在了解了这两种格式的 header 格式之后,我的代码仍然说它无法读取元素 [45][24] 处的颜色。我已经查看了其他几个选项,例如 libjpeg和 CImg,但我想在进入新图书馆之前先了解一下观点。

我的 bmp 代码如下:...剪断...

unsigned char*** create3dArray(FILE **fptr1,int height,int width,int depth)
{
unsigned char*** databuff = new unsigned char **[height];

// Allocate an array for each element of the first array
for(int x = 0; x < height; ++x)
{
databuff[x] = new unsigned char *[width];

// Allocate an array of integers for each element of this array
for(int y = 0; y < width; ++y)
{
databuff[x][y] = new unsigned char[depth];

// Specify an initial value (if desired)
for(int z = 0; z < depth; ++z)
{
databuff[x][y][z] = -1;

}
}
}

if ((sizeof(fheader) != 14) || (sizeof(iheader) != 40))
{
printf("Header structs are not properly packed\n");
return 0;
}

if (fread(&fheader, sizeof(fheader), 1, *fptr1) != 1)
{
printf("Couldn't read fheader.\n");
return 0;
}

if (fread(&iheader, sizeof(iheader), 1, *fptr1) != 1)
{
printf("Couldn't read iheader.\n");
return 0;
}
// uncomment to get an idea of what the headers look like.
if ((iheader.height != height) || (iheader.width != width) || (iheader.bits != 24))
{
printf("This only works for 512x512 24-color bitmaps\n");
return 0;
}



if (fheader.offset != 54) {
printf("This only works if the offset is equal to 54\n");
return 0;
}
for (int i = 0; i < iheader.height; i++) {
for (int j = 0; j < iheader.width; j++) {
if (fread(&databuff[i][j][0], 3, 1, *fptr1) != 1 ){
printf("Couldn't read colors for element [%d][%d]\n", i, j);
return 0;
}
}
}

return databuff;
}

template <typename Tx>
void destroy3dArray(Tx*** myArray)
{
delete[] **myArray;
delete[] *myArray;
delete[] myArray;
}

int main()
{
FILE *fptr1,*fptr2; // two file pointers one for each file.
int count=0;
float total_bits=0;
float ber=0; //variable for bit error rate
int width,height,depth;
cout<<"Please enter height of the image "<<endl;
cin>>height;
cout<<"Please enter width of the image "<<endl;
cin>>width;
cout<<"Please enter depth of the image. The max depth can be 3 for RGB values"<<endl;
cin>>depth;
char *filename = "lena512.bmp";
char *filename2 = "lena512_2.bmp";
//std::string trueBinaryDataInString[512][512][3];

if ((fptr1 = fopen(filename, "r")) == NULL) {
printf("Coulsn't open file %s for reading.\n", filename);
return 1;
}
unsigned char*** trueArray = create3dArray(&fptr1,height,width,depth);

for(int i=0;i<height;i++)
{
//std::cout << "Row " << i << std::endl;
for(int j=0;j<width;j++)
{
for(int k=0;k<depth;k++)
{

total_bits += ToBinary(trueArray[i][j][k]).length();

}
//std::cout<<endl;
}
//std::cout<<endl;
}
std::cout << total_bits<<endl;
//createAnddestroy3dArray<unsigned char> MyArray;
if ((fptr2 = fopen(filename2, "r")) == NULL) {
printf("Coulsn't open file %s for reading.\n", filename2);
return 1;
}
unsigned char*** trueArray2 = create3dArray(&fptr2,height,width,depth);
/*for(int i=0;i<512;i++)
{
std::cout << "Row " << i << std::endl;
for(int j=0;j<512;j++)
{
for(int k=0;k<3;k++)
{
std::cout<<" "<<ToBinary(trueArray2[i][j][k]);
}
std::cout<<endl;
}
std::cout<<endl;
}
*/
/******** BIT Error Rate Calculation ******/
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
for(int k=0;k<depth;k++)
{
if(ToBinary(trueArray[i][j][k])!= ToBinary(trueArray2[i][j][k]))
{
std::cout<<ToBinary(trueArray[i][j][k])<< " " <<ToBinary(trueArray2[i] [j][k])<<endl;
count++;
}
else
continue;
}
}
}
ber = (count/total_bits)*100;
std::cout<<"Bit Error Rate (BER) = "<<ber<<endl;
destroy3dArray<unsigned char>(trueArray); //Deallocating memory for array 1
destroy3dArray<unsigned char>(trueArray2); //Deallocating memory for array 2
return 0;
}

最佳答案

JPEG 和 TIFF 是压缩格式,在编码图像方面可能具有您可能期望的更大自由度。

所以您是从错误的角度来解决问题的。为了支持图像格式的选择,您需要库来读取文件并将其解压缩为位图,例如 24 位 RGB 或其他格式。可能需要进行颜色空间转换,因为比较图像之一可能被解压缩到 4:2:2 YUV 空间,而另一个是 4:2:0 等。

利用您选择的一些图像库(也许您也有操作系统限制),您将能够将文件加载并解压缩为您感兴趣的格式的二维像素数组。完成后,您可以将其输入到您的 C++ 数字运算代码中,并从那里进行比较。

关于c++ - jpeg 和 tiff 像素值提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11459741/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com