鱼C论坛

 找回密码
 立即注册
查看: 1611|回复: 16

[已解决]有大佬用C处理过图像吗,萌新请教——救救孩子

[复制链接]
发表于 2019-8-11 17:24:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
对于图像的逆透视变换,用matlab  实现   或者c实现   望大家不吝赐教  
最佳答案
2019-8-16 07:58:51
//只能处理bmp格式 24位
#include <stdio.h>
#include <stdlib.h>

//字节对齐,不然加载的数据一4字节对齐,会出现问题
#pragma pack(push)  
#pragma pack(2)  
//bmp分为 bmp文件头 bmp信息头 调色盘(24 32 没有) 位图数据
//一下是前两个的定义,其实Windows.h有,但我这是手机(Linux 电脑没在旁边时弄得)
//所以就从网上扒下来了

typedef  unsigned short WORD;
typedef unsigned long DWORD;
typedef  long LONG;

typedef struct tagBITMAPFILEHEADER {
WORD    bfType;
DWORD   bfSize;
WORD    bfReserved1;
WORD    bfReserved2;
DWORD   bfOffBits;
} BITMAPFILEHEADER;


typedef struct tagBITMAPINFOHEADER{
DWORD      biSize;
LONG        biWidth;
LONG        biHeight;
WORD       biPlanes;
WORD       biBitCount;
DWORD      biCompression;
DWORD      biSizeImage;
LONG        biXPelsPerMeter;
LONG        biYPelsPerMeter;
DWORD      biClrUsed;
DWORD      biClrImportant;
} BITMAPINFOHEADER;

#pragma pack(pop)  

int main(){
        //图像的地址
        char strFile[260] = "黄鹤楼.bmp";
    char strBuf[260];
        FILE* fp = fopen(strFile,"rb");       
        if(fp == NULL) {
                printf("打开文件失败...\n");
                return -1;
        }
        //保存图像地址
    FILE *fSava =  fopen("灰度化.bmp","wb");
    BITMAPFILEHEADER bmpFileHead;   
    BITMAPINFOHEADER bmpInfoHead;
    fread(&bmpFileHead,sizeof(BITMAPFILEHEADER ),1,fp);   
    fread(&bmpInfoHead,sizeof( BITMAPINFOHEADER),1,fp);
    //BMP以BM开头                                  位数是不是24位
    if(bmpFileHead.bfType != 19978 || bmpInfoHead.biBitCount!=24){
         printf("这啥图片,不合格\n");
         getchar();
            return -1;
    }
    printf("图片大小为:%dbyte\n分辨率:%d * %d\nbmp数据偏移:%dbyte\n",bmpFileHead.bfSize\
    ,bmpInfoHead.biWidth,bmpInfoHead.biHeight   ,  bmpFileHead.bfOffBits );
   
  int size = bmpFileHead.bfSize - bmpFileHead.bfOffBits;
  fwrite(&bmpFileHead,sizeof(bmpFileHead),1,fSava);
  fwrite(&bmpInfoHead,sizeof(bmpInfoHead),1,fSava);
   for(int i = 0; i < size; i+=3){
                char color[3];  
               fread(color,1,3,fp);                
               char buf = (color[0] + color[1] +color[2])/3;                //灰度化  需要bmp格式 24位 32位多了个A
           for(int j = 0; j < 3; j++){               
            fwrite(&buf,1,1,fSava);
         }
     }
   
    fclose(fSava);
        fclose(fp);
    printf("写入完成!\n");
    getchar();
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-11 17:26:46 | 显示全部楼层
救命啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-11 19:27:58 | 显示全部楼层
来人啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-14 16:35:45 | 显示全部楼层
easyx中 可以加载图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-15 08:25:10 | 显示全部楼层
yuesezhenmei 发表于 2019-8-14 16:35
easyx中 可以加载图片

我要对图像进行处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-15 10:37:39 | 显示全部楼层
python_小蟒蛇 发表于 2019-8-15 08:25
我要对图像进行处理

那你还不如用Windows画图呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-15 12:07:06 | 显示全部楼层
bin554385863 发表于 2019-8-15 10:37
那你还不如用Windows画图呢

不太明白大佬说的是什么神仙思路  嘿嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-15 12:19:04 | 显示全部楼层
python_小蟒蛇 发表于 2019-8-15 12:07
不太明白大佬说的是什么神仙思路  嘿嘿

C 只是一门编程语言,图像处理需要软件.除非你自己用C图像库编写一个图像处理软件.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-16 07:58:51 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
//只能处理bmp格式 24位
#include <stdio.h>
#include <stdlib.h>

//字节对齐,不然加载的数据一4字节对齐,会出现问题
#pragma pack(push)  
#pragma pack(2)  
//bmp分为 bmp文件头 bmp信息头 调色盘(24 32 没有) 位图数据
//一下是前两个的定义,其实Windows.h有,但我这是手机(Linux 电脑没在旁边时弄得)
//所以就从网上扒下来了

typedef  unsigned short WORD;
typedef unsigned long DWORD;
typedef  long LONG;

typedef struct tagBITMAPFILEHEADER {
WORD    bfType;
DWORD   bfSize;
WORD    bfReserved1;
WORD    bfReserved2;
DWORD   bfOffBits;
} BITMAPFILEHEADER;


typedef struct tagBITMAPINFOHEADER{
DWORD      biSize;
LONG        biWidth;
LONG        biHeight;
WORD       biPlanes;
WORD       biBitCount;
DWORD      biCompression;
DWORD      biSizeImage;
LONG        biXPelsPerMeter;
LONG        biYPelsPerMeter;
DWORD      biClrUsed;
DWORD      biClrImportant;
} BITMAPINFOHEADER;

#pragma pack(pop)  

int main(){
        //图像的地址
        char strFile[260] = "黄鹤楼.bmp";
    char strBuf[260];
        FILE* fp = fopen(strFile,"rb");       
        if(fp == NULL) {
                printf("打开文件失败...\n");
                return -1;
        }
        //保存图像地址
    FILE *fSava =  fopen("灰度化.bmp","wb");
    BITMAPFILEHEADER bmpFileHead;   
    BITMAPINFOHEADER bmpInfoHead;
    fread(&bmpFileHead,sizeof(BITMAPFILEHEADER ),1,fp);   
    fread(&bmpInfoHead,sizeof( BITMAPINFOHEADER),1,fp);
    //BMP以BM开头                                  位数是不是24位
    if(bmpFileHead.bfType != 19978 || bmpInfoHead.biBitCount!=24){
         printf("这啥图片,不合格\n");
         getchar();
            return -1;
    }
    printf("图片大小为:%dbyte\n分辨率:%d * %d\nbmp数据偏移:%dbyte\n",bmpFileHead.bfSize\
    ,bmpInfoHead.biWidth,bmpInfoHead.biHeight   ,  bmpFileHead.bfOffBits );
   
  int size = bmpFileHead.bfSize - bmpFileHead.bfOffBits;
  fwrite(&bmpFileHead,sizeof(bmpFileHead),1,fSava);
  fwrite(&bmpInfoHead,sizeof(bmpInfoHead),1,fSava);
   for(int i = 0; i < size; i+=3){
                char color[3];  
               fread(color,1,3,fp);                
               char buf = (color[0] + color[1] +color[2])/3;                //灰度化  需要bmp格式 24位 32位多了个A
           for(int j = 0; j < 3; j++){               
            fwrite(&buf,1,1,fSava);
         }
     }
   
    fclose(fSava);
        fclose(fp);
    printf("写入完成!\n");
    getchar();
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-8-16 08:06:27 From FishC Mobile | 显示全部楼层
以上那个代码我只想说明C语言只依赖标准库也能对图像做处理,但我通常不会这么写,我会用Windows.h库....东西处理图片,因为里面麻烦的事不止这一点,这个是对全体处理还好,如果是想靠这种原始方法加载图片。。。(它的位图数据那块是从左下到右上排列  不符合人的正常思维)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-16 08:09:36 From FishC Mobile | 显示全部楼层
而且对与16 24 32 ..要分别做处理,而且有的位图数据对齐......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-16 08:12:48 From FishC Mobile | 显示全部楼层
所以还是用Windows.h里的东西吧,关注一下BITMAP HBITMAP GetObject GetBitmapBits SetBitmapBits ....之类的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-16 08:19:13 From FishC Mobile | 显示全部楼层
我刚刚没看你下面还有个东西,逆透视是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-17 14:52:07 | 显示全部楼层
老张爱编程 发表于 2019-8-16 08:19
我刚刚没看你下面还有个东西,逆透视是什么?

就是图像变形了  获取到的与实际不符合  所以需要对图像矫正,比如梯形失真
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-17 20:14:55 | 显示全部楼层
python_小蟒蛇 发表于 2019-8-17 14:52
就是图像变形了  获取到的与实际不符合  所以需要对图像矫正,比如梯形失真

你这和开发一个图形处理软件有啥区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-17 22:10:10 | 显示全部楼层
老张爱编程 发表于 2019-8-16 07:58
//只能处理bmp格式 24位
#include
#include

厉害,应该精通C语言了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-17 23:07:51 From FishC Mobile | 显示全部楼层
2164930278 发表于 2019-8-17 22:10
厉害,应该精通C语言了吧

精通倒是没有,我只是想知道bmp里面是什么东西,就稍稍研究了下,感觉window里面的exe...这些东西的里面充满许多未知
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 19:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表