c++编写的图像读取、保存、相减、放大(最近邻插值。双线性插值)、均值滤波、中值滤波

这篇博客详细介绍了使用C++编程实现的图像处理算法,包括图像的读取、保存、相减、放大(最近邻插值和双线性插值)以及均值滤波和中值滤波。博主分享了原创代码,并特别指出处理的是灰度图像,尺寸为256*256,放大倍数为2倍。同时,博主还提到了中值滤波中应用了快速排序算法。
摘要由CSDN通过智能技术生成

         算法均为原创,因博主为新手,水平有限,需在这里对程序做一些说明,编译环境为VS2010,处理图像的格式为BMP,目前只编写了灰度图像的处理方法,图像大小为256*256。放大倍数为2倍,其中最近邻插值为通过链表处理,其余图像的处理方法为二维矩阵下处理,中值滤波中运用了快速排序算法,程序也会上传,写的不好还望大佬勿喷,游客支持。

#include "stdafx.h"

#include<math h="">  
#include <iomanip>   
#include <stdlib h="">  
#include <windows h="">  
#include <stdio h="">  
#include <stdlib h="">  
#include <iostream>  
#include <fstream>  
#include<string>
#include"quicksort.h"
using namespace std;
//---------------------------------------------------------------------------------------   
#define DOUBLE 2
//读入图像数据的指针  
unsigned char *pBmpBuf;
unsigned char *pBmpBuf_r;
unsigned char *pBmpBuf_l;
unsigned char *pBmpBuf_plus;//减法图像
unsigned char *pBmpBuf_zoom;//尺度变换图像
unsigned char *pBmpBuf_zoom2;
unsigned char *pBmpBuf_gaussian;
unsigned char *pBmpBuf_salt;
int bmpWidth;//图像的宽  
int bmpHeight;//图像的高  
RGBQUAD *pColorTable;//颜色表指针  
int biBitCount;//图像类型,每像素位数  

void quickSort(int s[], int l, int r);
//-------------------------------------------------------------------------------------------  
//读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中  
bool readBmp(char *bmpName)   
{  
	

    FILE *fp=fopen(bmpName,"rb");//二进制读方式打开指定的图像文件  
  
    if(fp==0)  
        return 0;  
  
    //跳过位图文件头结构BITMAPFILEHEADER  
  
    fseek(fp, sizeof(BITMAPFILEHEADER),0);  
	//cout<<sizeof(BITMAPFILEHEADER)<<endl;
  
    //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中  
  
    BITMAPINFOHEADER head;    
  
    fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息  
  
    bmpWidth = head.biWidth;  
  
    bmpHeight = head.biHeight;  
  
    biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)  
  
    //int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256  
    int lineByte=(bmpWidth * biBitCount)/32*4;//灰度图像有颜色表,且颜色表表项为256
    if(biBitCount==8)  
    {  
  
        //申请颜色表所需要的空间,读颜色表进内存  
  
        pColorTable=new RGBQUAD[256];  
  
        fread(pColorTable,sizeof(RGBQUAD),256,fp);  
		//cout<<sizeof(RGBQUAD)<<endl;
  
    }  
  
    //申请位图数据所需要的空间,读位图数据进内存  
  
    pBmpBuf=new unsigned char[lineByte * bmpHeight];  
  
    fread(pBmpBuf,1,lineByte * bmpHeight,fp);  ;

    fclose(fp);//关闭文件  
  
    return 1;//读取文件成功  
}  
  
//-----------------------------------------------------------------------------------------  
//给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中  
bool saveBmp(char *bmpName,  unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable)  
{  
  
    //如果位图数据指针为0,则没有数据传入,函数返回  
  
    if(!imgBuf)  
        return 0;  
  
    //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0  
  
    int colorTablesize=0;  
  
    if(biBitCount==8)  
        colorTablesize=1024;  
  
    //待存储图像数据每行字节数为4的倍数  
  
    int lineByte=(width * biBitCount/8+3)/4*4;  
  
    //以二进制写的方式打开文件  
  
    FILE *fp=fopen(bmpName,"wb");  
  
    if(fp==0)  
        return 0;  
  
    //申请位图文件头结构变量,填写文件头信息  
  
    BITMAPFILEHEADER fileHead;  
  
    fileHead.bfType = 0x4D42;//bmp类型  
  
    //bfSize是图像文件4个组成部分之和  
  
    fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height;  
  
    fileHead.bfReserved1 = 0;  
  
    fileHead.bfReserved2 = 0;  
  
    //bfOffBits是图像文件前3个部分所需空间之和  
  
    fileHead.bfOffBits=54+colorTablesize;  
  
    //写文件头进文件  
  
    fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);  
  
    //申请位图信息头结构变量,填写信息头信息  
  
    BITMAPINFOHEADER head;   
  
    head.biBitCount=biBitCount;  
  
    head.biClrImportant=0;  
  
    head.biClrUsed=0;  
  
    head.biCompression=0;  
  
    head.biHeight=height;  
  
    head.biPlanes=1;  
  
    head.biSize=40;  
  
    head.biSizeImage=lineByte*height;  
  
    head.biWidth=width;  
  
    head.biXPelsPerMeter=0;  
  
    head.biYPelsPerMeter=0;  
  
    //写位图信息头进内存  
  
    fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);  
  
    //如果灰度图像,有颜色表,写入文件   
  
    if(biBitCount==8)  
        fwrite(pColorTable, sizeof(RGBQUAD),256, fp);  
  
    //写位图数据进文件  
  
    fwrite(imgBuf, height*lineByte, 1, fp);  
  
    //关闭文件  
  
    fclose(fp);  
  
    return 1;  
  
}  
  
//----------------------------------------------------------------------------------------  
//以下为像素的读取函数  
void doIt()  
{  
    int m=0,n=0,count_xiang_su=0;  
    int lineByte=(bmpWidth * biBitCount)/32*4;
    //将图像左下角1/4部分置成黑色  
    ofstream outfile("图像像素.txt",ios::in|ios::trunc);  
	long int x_r,x_l,x_plus,x_flag;	
	if(biBitCount==8)
	 {
		 
		 for(x_flag = 0;x_flag<256*256;x_flag++) //减法操作将字符型变为整型相减
		 {	 		 
			 x_r = *(pBmpBuf_r + x_flag);
			 x_l = *(pBmpBuf_l + x_flag);
			 x_plus = x_r - x_l;
			 if(x_plus < 0)
					 x_plus = 0;
			 *(pBmpBuf_plus + x_flag) = x_plus;	
				 
		 }		 
		
	 }
    else if(biBitCount==24)  
    {//彩色图像  
        for(int i=0;i<bmpHeight;i++)  
        {  
            for(int j=0;j<bmpWidth;j++)  
            {  
                for(int k=0;k<3;k++)//每像素RGB三个分量分别置0才变成黑色  
                {  
                    //*(pBmpBuf+i*lineByte+j*3+k)-=40;  
                    m=*(pBmpBuf+i*lineByte+j*3+k);  
                    outfile<<m<<" ";  
                    count_xiang_su++;  
                    if(count_xiang_su%8==0)  
                    {  
                        outfile<<endl;  
                    }  
                //n++;  
                }  
                n++;  
            }  
  
  
        }  
      
    }  
    
}  
bool zoom1( unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable)//最近邻法
{
	int i,k = 0;
	unsigned char *pBmpBuf_zoom_2;//尺度变换图像
	bmpWidth = width * DOUBLE;
	bmpHeight = height * DOUBLE;
	int lineByte=(bmpWidth * biBitCount)/32*4;

    pBmpBuf_zoom=new unsigned char[lineByte* bmpHeight ];//放大二倍
	pBmpBuf_zoom_2=new unsigned char[lineByte * bmpHeight ];//放大二倍
	for(i = 0;i <  height*bmpWidth;i++)//横拉
	{
		*(pBmpBuf_zoom_2 + i) = *(imgBuf +i/DOUBLE);
	}
	
	for(i = 0;i < lineByte * bmpWidth;i++)//竖拉
	{
		*(pBmpBuf_zoom + i) = *(pBmpBuf_zoom_2 +i%bmpHeight+k*bmpHeight);
		if((i+1)%(bmpHeight * DOUBLE) == 0)
			k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值