关闭

2.1 图像处理框架搭建一之图像的输入输出

232人阅读 评论(0) 收藏 举报
#include <stdio.h>
#include <malloc.h>
#define path '添加你的图片路径'
#define BM 19778
typdef struct functions
{
  int IsBitMap(FILE *fp);//判断是否是bmp图片
  long getWidth(FILE *fp);//获取图像的宽
  long getHeight(FILE *fp);//获取图像的高
  unsigned short getBit(FILE *fp);//获得每个像素的位数
  unsigned int getOffSet(FILE *fp);//获得数据的起始位置,即数据偏移量
  void getData(FILE* fp, unsigned char *r, unsigned char *g, unsigned char *b)//获取图片的DIB数据
}

int IsBitMap(FILE *fp)//判断是否是bmp图片
{
  FILE *fp=fopen(path,'rb');
  unsign short s;
  fread(&s,1,2,fp);
  if(s==BM)   return 1;
  else
  return 0;
}
//获得图片的宽度,在18-21字节   
long getWidth(FILE *fp)
{
    long width;
    fseek(fp, 18, SEEK_SET);
    fread(&width, 1, 4, fp);
    return width;
}
//获得图片的高度 ,在22-25字节   
long getHeight(FILE *fp)
{
    long height;
    fseek(fp, 22, SEEK_SET);
    fread(&height, 1, 4, fp);
    return height;
}
//获得每个像素的位数,在28-29字节   
unsigned short getBit(FILE *fp)
{
    unsigned short bit;
    fseek(fp, 28, SEEK_SET);
    fread(&bit, 1, 2, fp);
    return bit;
}
//获得数据的起始位置  
unsigned int getOffSet(FILE *fp)
{
    unsigned int OffSet;
    fseek(fp, 10L, SEEK_SET);
    fread(&OffSet, 1, 4, fp);
    return OffSet;
}
//获得三通道的数组
void getData(FILE* fp, unsigned char *r, unsigned char *g, unsigned char *b)
{
    FILE* fpr;
    FILE* fpg;
    FILE* fpb;
    int i, j = 0;
    int stride;
    unsigned char* pix = NULL;
    long height, width;
    height = getHeight(fp);
    width = getWidth(fp);

    fseek(fp, getOffSet(fp), SEEK_SET); //找到位图的数据区   
    stride = (24 * width + 31) / 8; //对齐,计算一个width有多少个8位   
    stride = stride / 4 * 4;      //取四的倍数 r,g,b,alph   
                                  //写入数组   
    pix = (unsigned char *)malloc(stride*height);
    fpr = fopen("d:\\bmpr.txt", "w+");
    fpg = fopen("d:\\bmpg.txt", "w+");
    fpb = fopen("d:\\bmpb.txt", "w+");
    fread(pix, 1, stride*height, fp);
    for (j = 0; j<height; j++)
    {
        for (i = 0; i<width; i++)
        {
            fprintf(fpr, "%4d", pix[((height - j - 1)* width + i) * 3 + 2]);
            fprintf(fpg, "%4d", pix[((height - j - 1)* width + i) * 3 + 1]);
            fprintf(fpb, "%4d", pix[((height - j - 1)* width + i) * 3]);
        }
        fprintf(fpr, "\n");
        fprintf(fpg, "\n");
        fprintf(fpb, "\n");
    }
    //写入文件   
    fclose(fpr);
    fclose(fpg);
    fclose(fpb);
}
int main()
{
    long width, height;
    FILE *fp = fopen(PATH, "r");
    unsigned char *r, *g, *b;
    int i, j;
    r = (unsigned char *)malloc(8000);
    b = (unsigned char *)malloc(8000);
    g = (unsigned char *)malloc(8000);
    if (IsBitMap(fp))
        printf("该文件是位图!\n");
    else
    {
        printf("该文件不是位图!\n");
        fclose(fp);
        return 0;
    }
    printf("width=%ld\nheight=%ld\n", getWidth(fp), getHeight(fp));
    printf("该图像是%d位图\n", getBit(fp));
    printf("OffSet=%d\n", getOffSet(fp));
    getData(fp, r, g, b);

    return (0);
}
0
0
查看评论

图像处理之模板匹配

/* Template matching methods */enum { CV_TM_SQDIFF =0, CV_TM_SQDIFF_NORMED =1, CV_TM_CCORR =2, CV_TM_CCORR_NORMED =3, ...
  • littleThink
  • littleThink
  • 2014-08-22 19:21
  • 1130

图像处理之滤波算法

一、学习心得: 在我学习基本滤波算法原理的时候,因为刚接触不是很理解算法具体是怎样实现的,不过在学习了图像形态学之后,发现滤波算法其实很简单。所以在此建议初学者在学习滤波算法之前,可以先学习一下图像形态学,会达到事半功倍的效果。二、对于滤波功能的理解: 滤波算法,可以理解...
  • swj110119
  • swj110119
  • 2016-05-05 14:17
  • 7021

图像处理-基本算法之线性变换

线性变换是灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度从而达到图像增强的目的。      其公式可以表示为y(x, y) = k * x(x, y) + b;其中y(x, y)表示目标像素值,x(x, y)表示源像素值,k表示斜率,b表示...
  • fuyun_613
  • fuyun_613
  • 2012-06-13 12:43
  • 1783

2014-09-18 数学建模图像处理

三天的比赛结束了。今年的题比较变态,我已经被虐到无力吐槽了。。不过真是不到最后逼自己一把成不了事。最后一天突破了好多的困难。在最后的一小时里写完了论文,完成了全部的任务。     一开始报选修课的时候选matlab的原因是想学一下matlab的图像处理。然后...
  • u012363005
  • u012363005
  • 2016-07-03 10:22
  • 764

Tensorflow深度学习之十二:基础图像处理之二

首先放出原始图像:1、图像的翻转import tensorflow as tf import cv2# 这里定义一个tensorflow读取的图片格式转换为opencv读取的图片格式的函数 # 请注意: # 在tensorflow中,一个像素点的颜色顺序是R,G,B。 # 在opencv中,一个像素...
  • DaVinciL
  • DaVinciL
  • 2017-08-02 21:03
  • 899

图像处理基本算法--仿射变换

几何空间变换和图像配准   几何空间变换又称为橡皮膜变换,因为他可以看做是在一幅橡皮膜上印制图像,然后根据一定规则拉伸橡皮膜。由两个基本操作组成: 1)坐标的空间变换 2)灰度内插 最常用的是仿射变换一般形式如下: [x,y,1] = [v,w,1]*T   ...
  • renshengrumenglibing
  • renshengrumenglibing
  • 2012-01-04 23:26
  • 7214

关于图像处理的特征检测、特征提取和匹配的理解

看了很多文献,包括中英文文献,一直都纠结各种概念,包括特征检测,特征选择,特征提取,特征描述和特征匹配,在进行特征点匹配、目标检测和图像配准时用到这类概念和方法时,如何理解他们的关系很重要。 本人结合mathworks官网和一些文献,给出了自己的理解。      1. ...
  • fzthao
  • fzthao
  • 2017-03-09 10:51
  • 556

数字图像处理之二维码图像提取算法(三)

二维码预处理之自适应亮度均衡算法的介绍
  • c602273091
  • c602273091
  • 2014-11-06 15:02
  • 2525

图像处理--图像分割算法介绍

图像分割的主要算法: 1.基于阈值的分割方法 2.基于边缘的分割方法 3.基于区域的分割方法 4.基于聚类分析的图像分割方法 5.基于小波变换的分割方法 6.基于数学形态学的分割方法 7.基于人工神经网络的分割方法 基于阈值的分割方法 阈值分割方法作为一种常见的区域并行技术,就是...
  • yangleo1987
  • yangleo1987
  • 2016-11-15 17:21
  • 4668

数字图像处理之二维码图像提取算法(十一)

 // check ratio requirement b:w:b:w:b = 1:1:3:1:1 bool qr_checkRatio() { totalFinderSize = 0; for(int i =0;i<5; i++) { i...
  • c602273091
  • c602273091
  • 2014-12-20 10:15
  • 2307
    个人资料
    • 访问:7708次
    • 积分:219
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    最新评论