iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现二值图像模拟灰值图像显示效果
  • 142
分享到

C语言实现二值图像模拟灰值图像显示效果

2024-04-02 19:04:59 142人浏览 安东尼
摘要

本文实例为大家分享了C语言实现二值图像模拟灰值图像显示效果的具体代码,供大家参考,具体内容如下 图案法 图案法(patterning)是指灰度可以用一定比例的黑白点组成的区域表示,从

本文实例为大家分享了C语言实现二值图像模拟灰值图像显示效果的具体代码,供大家参考,具体内容如下

图案法

图案法(patterning)是指灰度可以用一定比例的黑白点组成的区域表示,从而达到整体图象的灰度感。黑白点的位置选择称为图案化。

下面介绍的一种设计标准图案的算法,是由Limb在1969年提出的。

先以一个2×2的矩阵开始:

通过递归关系有:

其中Mn和Un均为2n×2n的方阵,Un的所有元素都是1。
根据这个算法M2如下,为16级灰度的标准图案:

M3(8×8阵)比较特殊,称为Bayer抖动表。M4是一个16×16的矩阵。

M3 表模拟灰值图像显示效果:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma pack(1)   //全紧凑模式

typedef struct {
 unsigned char bfType[2];
 unsigned long bfSize;
 unsigned short bfReserved1;
 unsigned short bfReserved2;
 unsigned long bfOffBits;
}bitmapFileHeader;

typedef struct {
 unsigned long biSize;
 unsigned long biWidth;
 unsigned long biHeight;
 unsigned short biPlanes;
 unsigned short biBitCount;
 unsigned long biCompression;
 unsigned long biSizeImage;
 long biXPixPerMeter;
 long biYPixPerMeter;
 unsigned long biClrUsed;
 unsigned long biClrImportant;
}bitmapinfoHeader;


typedef struct{
 unsigned char rgbBlue;
 unsigned char rgbGreen;
 unsigned char rgbRed;
 unsigned char rgbReserved;

}rgbQUAD;

typedef struct{
 bitmapFileHeader bfHeader;
 bitmapInfoHeader biHeader;
 rgbQUAD palette[256];
 unsigned char *imgData;
}bmp;

int main(){
 FILE *fp;
 if((fp=fopen("d:\Temp\\test_gray.bmp","rb"))==NULL){
  perror("can not open file!");
  return -1;
 }
 //读入彩色bmp图像文件头,信息头和图像数据
 bitmapFileHeader bfHeader;
 fread(&bfHeader,14,1,fp);
 bitmapInfoHeader biHeader;
 fread(&biHeader,40,1,fp);
 int imSize=biHeader.biSizeImage;
 int width=biHeader.biWidth;
 int height=biHeader.biHeight;
 int bitCount=biHeader.biBitCount;
 int lineBytes=(width*bitCount+31)/32*4;
 
 fseek(fp,bfHeader.bfOffBits,SEEK_SET);
 unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));
 fread(imageData,imSize*sizeof(unsigned char),1,fp); 
 fclose(fp);

 bmp b;
 memcpy(&(b.bfHeader),&bfHeader,sizeof(bfHeader));
 memcpy(&(b.biHeader),&biHeader,sizeof(biHeader));
 b.imgData=(unsigned char*)malloc(sizeof(unsigned char)*imSize);
 memset(b.imgData,0,sizeof(unsigned char)*imSize);
 for(int i=0;i<256;i++){
  b.palette[i].rgbBlue=i;
  b.palette[i].rgbGreen=i;
  b.palette[i].rgbRed=i;
 }
 
 int i,j,temp;
 unsigned char bayer[8][8]={  
  0,32,8,40,2,34,10,42,
  48,16,56,24,50,18,58,26,
  12,44,4,36,14,46,6,38,
  60,28,52,20,62,30,54,22,
  3,35,11,43,1,33,9,41,
        51,19,59,27,49,17,57,25,
  15,47,7,39,13,45,5,37,
        63,31,55,23,61,29,53,21
 };
 for(i=0;i<height;i++){ 
  for(j=0;j<width;j++){ 
   temp=imageData[lineBytes*i+j];
   if((temp>>2)>bayer[i&7][j&7])
    b.imgData[lineBytes*i+j]=255;
   else
    b.imgData[lineBytes*i+j]=0;
  }
 }
 
 char savePath[]="D:\Temp\\save_test.bmp";
 FILE *f_save=fopen(savePath,"wb");
 if(f_save==NULL){
  perror("can not open file!");
  return -2;
 }

 fwrite(&b.bfHeader,sizeof(bitmapFileHeader),1,f_save);
 fwrite(&b.biHeader,sizeof(bitmapInfoHeader),1,f_save);
 fwrite(&b.palette,1024,1,f_save);
 fwrite(b.imgData,sizeof(unsigned char)*b.biHeader.biSizeImage,1,f_save);
 fclose(f_save);
 
 free(imageData);
 free(b.imgData);
 getchar();
 return 0;
}

代码效果:

抖动法

假设灰度级别的范围从b(black)到w(white),中间值t为(b+w)/2,对应256级灰度,b=0,w=255,t=127.5。设原图中象素的灰度为g,误差值为e,则新图中对应象素的值用如下的方法得到:


if g > t then
  打白点
  e=g-w
else 
  打黑点
  e=g-b
 3/8 × e 加到右边的象素
 3/8 × e 加到上边的象素
 1/4 × e 加到右上方的象素

实现代码:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma pack(1)   //全紧凑模式

typedef struct {
 unsigned char bfType[2];
 unsigned long bfSize;
 unsigned short bfReserved1;
 unsigned short bfReserved2;
 unsigned long bfOffBits;
}bitmapFileHeader;

typedef struct {
 unsigned long biSize;
 unsigned long biWidth;
 unsigned long biHeight;
 unsigned short biPlanes;
 unsigned short biBitCount;
 unsigned long biCompression;
 unsigned long biSizeImage;
 long biXPixPerMeter;
 long biYPixPerMeter;
 unsigned long biClrUsed;
 unsigned long biClrImportant;
}bitmapInfoHeader;


typedef struct{
 unsigned char rgbBlue;
 unsigned char rgbGreen;
 unsigned char rgbRed;
 unsigned char rgbReserved;

}rgbQUAD;

typedef struct{
 bitmapFileHeader bfHeader;
 bitmapInfoHeader biHeader;
 rgbQUAD palette[256];
 unsigned char *imgData;
}bmp;

int main(){
 FILE *fp;
 if((fp=fopen("d:\Temp\\test_gray.bmp","rb"))==NULL){
  perror("can not open file!");
  return -1;
 }
 //读入彩色bmp图像文件头,信息头和图像数据
 bitmapFileHeader bfHeader;
 fread(&bfHeader,14,1,fp);
 bitmapInfoHeader biHeader;
 fread(&biHeader,40,1,fp);
 int imSize=biHeader.biSizeImage;
 int width=biHeader.biWidth;
 int height=biHeader.biHeight;
 int bitCount=biHeader.biBitCount;
 int lineBytes=(width*bitCount+31)/32*4;
 
 fseek(fp,bfHeader.bfOffBits,SEEK_SET);
 unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));
 fread(imageData,imSize*sizeof(unsigned char),1,fp); 
 fclose(fp);

 bmp b;
 memcpy(&(b.bfHeader),&bfHeader,sizeof(bfHeader));
 memcpy(&(b.biHeader),&biHeader,sizeof(biHeader));
 b.imgData=(unsigned char*)malloc(sizeof(unsigned char)*imSize);
 memset(b.imgData,0,sizeof(unsigned char)*imSize);
 for(int i=0;i<256;i++){
  b.palette[i].rgbBlue=i;
  b.palette[i].rgbGreen=i;
  b.palette[i].rgbRed=i;
 }
 
 int i,j,temp;
 double e,f;
 for(i=0;i<height;i++){
  for(j=0;j<width;j++){
   b.imgData[lineBytes*i+j]=imageData[lineBytes*i+j]; //拷贝数据
  }
 }
 
 for(i=0;i<height;i++){ 
  for(j=0;j<width;j++){ 
   temp=b.imgData[lineBytes*i+j];
   if(temp>128){
    b.imgData[lineBytes*i+j]=255;
    e=(float)(temp-255);
   }
   else{
    b.imgData[lineBytes*i+j]=0;
    e=(float)temp;
   }
   if(j<width-1){
    f=b.imgData[lineBytes*i+j+1];
    f+=3.0/8.0*e;
    b.imgData[lineBytes*i+j+1]=(unsigned char)f; //向右传播
   }
   if(i<height-1){
    f=b.imgData[lineBytes*(i+1)+j];
    f+=3.0/8.0*e;
    b.imgData[lineBytes*(i+1)+j]=(unsigned char)f; //向上传播
    f=b.imgData[lineBytes*(i+1)+j+1];
    f+=1.0/4.0*e;
    b.imgData[lineBytes*(i+1)+j+1]=(unsigned char)f; //向右上传播
   }
  }
 }
 
 
 char savePath[]="D:\Temp\\save_test.bmp";
 FILE *f_save=fopen(savePath,"wb");
 if(f_save==NULL){
  perror("can not open file!");
  return -2;
 }

 fwrite(&b.bfHeader,sizeof(bitmapFileHeader),1,f_save);
 fwrite(&b.biHeader,sizeof(bitmapInfoHeader),1,f_save);
 fwrite(&b.palette,1024,1,f_save);
 fwrite(b.imgData,sizeof(unsigned char)*b.biHeader.biSizeImage,1,f_save);
 fclose(f_save);
 
 free(imageData);
 free(b.imgData);
 getchar();
 return 0;
}

代码效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C语言实现二值图像模拟灰值图像显示效果

本文链接: https://www.lsjlt.com/news/155378.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言实现二值图像模拟灰值图像显示效果
    本文实例为大家分享了C语言实现二值图像模拟灰值图像显示效果的具体代码,供大家参考,具体内容如下 图案法 图案法(patterning)是指灰度可以用一定比例的黑白点组成的区域表示,从...
    99+
    2024-04-02
  • C语言实现24位彩色图像二值化
    本文实例为大家分享了C语言实现24位彩色图像二值化的具体代码,供大家参考,具体内容如下 // huiduhua.cpp : 定义控制台应用程序的入口点。 // #includ...
    99+
    2024-04-02
  • C语言实现将彩色bmp图像转化为灰图、灰度图像反色
    本文实例为大家分享了C语言实现将彩色bmp图像转化为灰图、灰度图像反色的具体代码,供大家参考,具体内容如下 彩色图像转灰度图像 彩色(24位)bmp图像结构: typedef s...
    99+
    2024-04-02
  • C语言实现BMP图像处理(彩色图转灰度图)
    我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量。所以处理很简单,根据 R、G、B 的值求出 Y 值后,将 R、G、B 值都赋值成 Y,写入新图即可。 在...
    99+
    2024-04-02
  • Flutter使用NetworkImage实现图像显示效果
    使用 NetworkImage 显示图像 在 GitHub 中,每个成员都有其头像的 URL。您的下一个改进是将该头像添加到Member课程中并在应用程序中显示这些头像。 更新Mem...
    99+
    2024-04-02
  • 详解Python+OpenCV实现图像二值化
    目录一、图像二值化1.效果2.源码二、图像二值化(调节阈值)1.源码一2.源码二一、图像二值化 1.效果 2.源码 import cv2 import numpy as np im...
    99+
    2024-04-02
  • 利用Python实现图像的二值化
       目录 1、全局阈值法 1.1主要函数: 1.2全局阈值的代码实现 1.3特点 2、自适应阈值法 2.1主要函数: 2.2实现代码: 2.3特点: 3、OTSU二值化(最大类间方差法) 3.1实现代码: 3.2特点 4、实例展示 参考文...
    99+
    2023-09-17
    python 计算机视觉 开发语言
  • OpenCV图像的二值化怎么实现
    这篇“OpenCV图像的二值化怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV图像的二值化怎么实现”文章吧...
    99+
    2023-07-05
  • Flutter怎么使用NetworkImage实现图像显示效果
    本篇内容主要讲解“Flutter怎么使用NetworkImage实现图像显示效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Flutter怎么使用NetworkImage实现图像显示效果”吧!...
    99+
    2023-06-30
  • matlab怎么实现二值图像孔洞填充
    在MATLAB中,你可以使用以下步骤来实现二值图像的孔洞填充: 读取二值图像:使用imread函数读取图像并转换为二值图像。 b...
    99+
    2023-10-21
    matlab
  • C++ opencv图像处理实现灰度变换示例
    目录灰度变换概念灰度变换的作用灰度变换的方法灰度化灰度的概念对彩色图进行灰度化1.加权平均值法2.取最大值3.平均值灰度的线性变换1.线性变换2.分段线性变换灰度的非线性变换1.对数...
    99+
    2024-04-02
  • 基于Python实现二维图像双线性插值
    目录插值简介最近邻法 (Nearest Interpolation)双三次插值 (Bicubic interpolation)双线性插值 (Bilinear Interpolatio...
    99+
    2024-04-02
  • 怎么在python中实现全局图像二值化
    本篇文章给大家分享的是有关怎么在python中实现全局图像二值化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python的五大特点:1.简单易学,...
    99+
    2023-06-14
  • C++和OpenCV实现图像字符化效果
    目录实现原理功能函数代码作者:翟天保Steven版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 图像字符化的意思是将图像以字符形式呈现,具有一...
    99+
    2024-04-02
  • C语言实现BMP图像细化处理
    细化(thinning)算法有很多,我们在这里介绍的是一种简单而且效果很好的算法,用它就能够实现从文本抽取骨架的功能。我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用 ...
    99+
    2024-04-02
  • C语言实现bmp图像平移操作
    平移变换是一种几何变换。平移的公式为:x1=x0+t,y1=y0+t,其中(x0,y0)是原图像中的坐标,(x1,y1)是经过平移变换后的对应点的坐标。 在编程中,先将处理后图像的所...
    99+
    2024-04-02
  • 基于Python如何实现二维图像双线性插值
    本篇内容主要讲解“基于Python如何实现二维图像双线性插值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现二维图像双线性插值”吧!在对二维数据进行 resize / ma...
    99+
    2023-07-02
  • C++ OpenCV如何实现图像双三次插值算法
    本篇内容主要讲解“C++ OpenCV如何实现图像双三次插值算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ OpenCV如何实现图像双三次插值算法”吧!一、图像双三...
    99+
    2023-06-21
  • c语言图像识别算法怎么实现
    要实现图像识别算法,可以使用以下步骤: 数据预处理:首先,将图像转换为数字矩阵表示。可以使用图像处理库(例如OpenCV)读取图...
    99+
    2023-10-24
    c语言
  • C++OpenCV实现图像双三次插值算法详解
    目录前言一、图像双三次插值算法原理二、C++ OpenCV代码1.计算权重矩阵2.遍历插值3. 测试及结果前言 近期在学习一些传统的图像处理算法,比如传统的图像插值算法等。传统的图像...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作