我是靠谱客的博主 动听小蚂蚁,最近开发中收集的这篇文章主要介绍图像信息处理实验三,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

要求:

1.Image logarithmic operation for visibility enhancement

2.Histogram equalization

#include <stdio.h>
#include <Windows.h>
#include <math.h>
void ToGrey(char* a, char* b)
{
	BITMAPFILEHEADER fileHeader;// 位图头文件
	BITMAPINFOHEADER infoHeader;// 位图信息头
	FILE* pFile = fopen(a, "rb");
	if (pFile == NULL)
	{
		printf("打开文件失败n");
		exit(-1);
	}
	// 读取头信息
	fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);   //读取文件头
	fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);   //读取信息头
	WORD bitCount = infoHeader.biBitCount;//色彩的位数
	if (bitCount == 16)
	{
		exit(-1);
	}
	int Clr = 0;

	RGBQUAD *QUAD = NULL;
	if (bitCount < 16)
	{

		Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;
		if (Clr>256)
			Clr = 0;
	}
	// 读取调色板
	int i = 0, j = 0;
	if (Clr > 0)
	{
		QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);
		fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);
		for (i = 0; i < Clr; i++)
		{
			QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =
				(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue);  //灰度图像三个都是y
		}
	}
	LONG pW = infoHeader.biWidth;     //图像数据的宽度
	LONG pH = infoHeader.biHeight;    //图像数据的高度

	int pSize = ((pW * bitCount)>>3)*pH;  //图像数据大小
	BYTE* P = (BYTE*)malloc(pSize);   //申请空间保存图像数据
	int LineSize = ((pW * bitCount)>> 3);  //行数据大小
	fread(P, pSize, 1, pFile);     //存入图像数据
	if (Clr == 0)
	{
		for (i = 0; i < pH; i++)//行
		{
			if (bitCount == 24)
			{
				for (j = 0; j < pW*3; j = j + 3)// 列
				{
					int n = i*LineSize + j;
					P[n] = P[n + 1] = P[n + 2] = (BYTE)(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]); //分别是r,g,b分量

				}
			}

		}
	}

	FILE* dFile = fopen(b, "wb");//创建目标文件

	fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile);   //写入文件头

	fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile);  //写入文件信息头
	if (QUAD)
	{
		fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);
	}
	//写入图像数据
	fwrite(P, pSize, 1, dFile);
	fclose(dFile);

	if (QUAD)
	{
		free(QUAD);
		QUAD = NULL;
	}
	if (P)
	{
		free(P);
		P = NULL;
	}
}

void Logarithmic(char* a, char* b)
{
	BITMAPFILEHEADER fileHeader;// 位图头文件
	BITMAPINFOHEADER infoHeader;// 位图信息头
	FILE* pFile = fopen(a, "rb");
	if (pFile == NULL)
	{
		printf("打开文件失败n");
		exit(-1);
	}
	// 读取头信息
	fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);   //读取文件头
	fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);   //读取信息头
	WORD bitCount = infoHeader.biBitCount;//色彩的位数
	if (bitCount == 16)
	{
		exit(-1);
	}
	int Clr = 0;

	RGBQUAD *QUAD = NULL;
	if (bitCount < 16)
	{

		Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;
		if (Clr>256)
			Clr = 0;
	}
	// 读取调色板
	int i = 0, j = 0;
	if (Clr > 0)
	{
		QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);
		fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);
		for (i = 0; i < Clr; i++)
		{
			QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =
				(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue);  //灰度图像三个都是y
		}
	}
	LONG pW = infoHeader.biWidth;     //图像数据的宽度
	LONG pH = infoHeader.biHeight;    //图像数据的高度

	int pSize = ((pW * bitCount)>>3)*pH;  //图像数据大小
	BYTE* P = (BYTE*)malloc(pSize);   //申请空间保存图像数据
	int LineSize = ((pW * bitCount)>> 3);  //行数据大小
	fread(P, pSize, 1, pFile);     //存入图像数据
	int max=0,index;
	if (Clr == 0)
	{
		for (i = 0; i < pH; i++)//行
		{
			if (bitCount == 24)
			{
				for (j = 0; j < pW*3; j = j + 3)// 列
				{
					int n = i*LineSize + j;
					index = P[n] = P[n + 1] = P[n + 2] = (BYTE)(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]); //分别是r,g,b分量
                    if(index > max)
                        max = index;
				}
			}

		}
	}

    printf("%d",max);

    for (i = 0; i < pH; i++)//行
		{
			if (bitCount == 24)
			{
				for (j = 0; j < pW*3; j = j + 3)// 列
				{
					int n = i*LineSize + j;
					P[n] = P[n + 1] = P[n + 2] = (BYTE)(255*log10(P[n]+1)/log10(max+1));

				}
			}

		}
	FILE* dFile = fopen(b, "wb");//创建目标文件

	fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile);   //写入文件头

	fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile);  //写入文件信息头
	if (QUAD)
	{
		fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);
	}
	//写入图像数据
	fwrite(P, pSize, 1, dFile);
	fclose(dFile);

	if (QUAD)
	{
		free(QUAD);
		QUAD = NULL;
	}
	if (P)
	{
		free(P);
		P = NULL;
	}
}

void Histogram(char* a, char* b)
{
	BITMAPFILEHEADER fileHeader;// 位图头文件
	BITMAPINFOHEADER infoHeader;// 位图信息头
	FILE* pFile = fopen(a, "rb");
	if (pFile == NULL)
	{
		printf("打开文件失败n");
		exit(-1);
	}
	// 读取头信息
	fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);   //读取文件头
	fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);   //读取信息头
	WORD bitCount = infoHeader.biBitCount;//色彩的位数
	if (bitCount == 16)
	{
		exit(-1);
	}
	int Clr = 0;

	RGBQUAD *QUAD = NULL;
	if (bitCount < 16)
	{

		Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;
		if (Clr>256)
			Clr = 0;
	}
	// 读取调色板
	int i = 0, j = 0;
	if (Clr > 0)
	{
		QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);
		fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);
		for (i = 0; i < Clr; i++)
		{
			QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =
				(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue);  //灰度图像三个都是y
		}
	}
	LONG pW = infoHeader.biWidth;     //图像数据的宽度
	LONG pH = infoHeader.biHeight;    //图像数据的高度

	int pSize = ((pW * bitCount)>>3)*pH;  //图像数据大小
	BYTE* P = (BYTE*)malloc(pSize);   //申请空间保存图像数据
	int LineSize = ((pW * bitCount)>> 3);  //行数据大小
	fread(P, pSize, 1, pFile);     //存入图像数据
	int Min = 120;
	int Max = 120;
	int now;
	double grey[256]={0};
	if (Clr == 0)
	{
		for (i = 0; i < pH; i++)//行
		{
			if (bitCount == 24)
			{
				for (j = 0; j < pW*3; j = j + 3)// 列
				{
					int n = i*LineSize + j;
					now = P[n] = P[n + 1] = P[n + 2] = (BYTE)(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]); //分别是r,g,b分量
					grey[P[n]]++;       //灰度直方图
                    if(now > Max)
                        Max = now;           //找到最大最小
                    if(now < Min)
                        Min = now;
				}
			}

		}
	}
	for(i = 0;i < Max;i++)
        grey[i] = grey[i]/(pH*pW);

    printf("max=%d,min=%d",Max,Min);
    //累计直方图
    double greyadd[256]={0};
	for(i = 0;i < 253; i++){
        for(j = 0;j <= i;j++)
            greyadd[i]+=grey[j];
	}
	printf("%f %f",greyadd[0],greyadd[1]);
    printf("n%fn%fn%f",grey[0],grey[1],grey[253]);

    //新值
	if (Clr == 0)
	{
		for (i = 0; i < pH; i++)//行
		{
			if (bitCount == 24)
			{
				for (j = 0; j < pW*3; j = j + 3)// 列
				{
					int n = i*LineSize + j;
					P[n] = P[n + 1] = P[n + 2] = (BYTE)(Min+(Max-Min)*greyadd[P[n]]);

				}
			}

		}
	}

	FILE* dFile = fopen(b, "wb");//创建目标文件

	fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile);   //写入文件头

	fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile);  //写入文件信息头
	if (QUAD)
	{
		fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);
	}
	//写入图像数据
	fwrite(P, pSize, 1, dFile);
	fclose(dFile);

	if (QUAD)
	{
		free(QUAD);
		QUAD = NULL;
	}
	if (P)
	{
		free(P);
		P = NULL;
	}
}

int main()
{
	ToGrey("a.bmp", "graya.bmp");
	Logarithmic("a.bmp", "lga.bmp");
    ToGrey("b.bmp", "grayb.bmp");
	Logarithmic("b.bmp", "lgb.bmp");
	ToGrey("c1.bmp", "grayc.bmp");
	Logarithmic("c1.bmp","lgc.bmp");
	Histogram("c1.bmp","Hc1.bmp");
	return 0;
}


最后

以上就是动听小蚂蚁为你收集整理的图像信息处理实验三的全部内容,希望文章能够帮你解决图像信息处理实验三所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部