数字图像的几种处理算法

文章目录

1.二值化

2.海报化

3.灰度化

1)分量法

2)最大值法

3) 平均值法

4) 加权平均法

4.模糊化

1.二值化

二值化就是将图像划分成黑和白,通过设定一个标准(如果大于这个标准就设为白,如果小于这个标准,就设为黑),而这个标准,就叫做阈值。

具体定义如下所示:

图片

实现代码:

//二值化
//函数的参数iTR为阈值
void CBMPSampleDlg::ThresholdProcess(int iTR){
         //读取BMP文件
         m_Dib.AttachMapFile("1.bmp", TRUE);
         m_Dib.CopyToMapFile("二值化.bmp");
         //将像素指针定位到图像数据的开始
         RGBTRIPLE *rgbtri = (RGBTRIPLE *)m_Dib.m_lpImage;
         //获得图像的大小
         int iSize = m_Dib.GetSizeImage();
         //BMP文件头指针
         BITMAPINFOHEADER * pBmiHeader = (BITMAPINFOHEADER *)m_Dib.m_lpBMIH;
        //遍历每一个像素,并判断每一个像素的分量(RGB),将其与阈值比较,然后进行赋值
        for(int i = 0; i < iSize/( pBmiHeader->biBitCount / 8); i++)
        {
                   if ( (rgbtri[i].rgbtRed < iTR )| (rgbtri[i].rgbtGreen < iTR) | (rgbtri[i].rgbtBlue < iTR) )
                   {
                            rgbtri[i].rgbtRed   = (BYTE) 0;
                            rgbtri[i].rgbtGreen = (BYTE) 0;
                            rgbtri[i].rgbtBlue  = (BYTE) 0;
                   }
                   else
                   {
                            rgbtri[i].rgbtRed   = (BYTE) 255;
                            rgbtri[i].rgbtGreen = (BYTE) 255;
                            rgbtri[i].rgbtBlue  = (BYTE) 255;
                   }
        }
         //显示图像
         DrawPic();
}

在读取图像之后,会将指针定位到图像像素数据的开始位置,然后获得图像的大小,然后通过BMP文件头获得图像的一个像素所占据的二进制的位数,这样就知道一个像素由几个字节组成的了,需要注意的是,一个像素不一定是由三个字节组成的,比如是灰度图像其只需要一个字节来存储一个像素究竟是灰到什么程度其范围在0-255 之间,而彩色图像却是由三种颜色组成的也就是所说的三原色RGB分别为Red、Green、Blue三种颜色组成,这三种颜色每个分量各占一个字节,所以这里需要三个字节,另外在BMP图像中还一个结构为RGBQUAD的结构体,这里一个像素占据的是4个字节,其实,这里就涉及到了8位图像24位图像以及32位图像的问题了,所谓的8位图像其实,每一个像素占一个字节,24位图像,每一个像素占据3个字节、而32位图像每一个像素占据4个字节就是这么来的。代码中,首先会读取原始图像文件,文件的格式为BMP。

2.海报化

海报化是将每一个像素的分量与224进行与运算,而244的16进制表示可以表示成0xe0,前面介绍了一个像素的分量的范围在0-255范围内,所以只需要将这两个数值的二进制位相与即可完成海报化的处理效果。

实现代码:

//海报化
void CBMPSampleDlg::Posterize(){
         m_Dib.AttachMapFile("1.bmp", TRUE);
         m_Dib.CopyToMapFile("海报化.bmp");
         RGBTRIPLE *rgbtri = (RGBTRIPLE *)m_Dib.m_lpImage;
         int iSize = m_Dib.GetSizeImage();
         BITMAPINFOHEADER * pBmiHeader = (BITMAPINFOHEADER *)m_Dib.m_lpBMIH;
         for(int i = 0; i < iSize/( pBmiHeader->biBitCount / 8); i++)
         {
                   rgbtri[i].rgbtRed   = (BYTE) (rgbtri[i].rgbtRed & 0xe0);
                   rgbtri[i].rgbtGreen = (BYTE) (rgbtri[i].rgbtGreen & 0xe0);
                   rgbtri[i].rgbtBlue  = (BYTE) (rgbtri[i].rgbtBlue & 0xe0);
         }
         DrawPic();
}

上面的这段代码是参考DirectShow里面的ezrgb24滤镜这个例子改写的,另外下面的灰度化也是采用里面的改写的。

3.灰度化

灰度化有很多种处理方法,有分量法、最大值法、平均值法以及加权平均值法。

1)分量法

将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。

f1(i,j)=R(i,j) f2(i,j)=G(i,j)f3(i,j)=B(i,j)

其中fk(i,j)(k=1,2,3)为转换后的灰度图像在(i,j)处的灰度值。

2)最大值法

将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。

f(i,j)=max(R(i,j),G(i,j),B(i,j))

3) 平均值法

将彩色图像中的三分量亮度求平均得到一个灰度图。

f(i,j)=(R(i,j)+G(i,j)+B(i,j)) /3

4) 加权平均法

根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))

采用加权平均法进行灰度化代码:

//灰度化
void CBMPSampleDlg::ConvertToGray(){
         m_Dib.AttachMapFile("1.bmp", TRUE);
         m_Dib.CopyToMapFile("灰度化.bmp");
         RGBTRIPLE *rgbtri = (RGBTRIPLE *)m_Dib.m_lpImage;
         int iSize = m_Dib.GetSizeImage();
         BITMAPINFOHEADER * pBmiHeader = (BITMAPINFOHEADER *)m_Dib.m_lpBMIH;
         int iGrayvalue = 0;
    //遍历每一个像素
         for(int i = 0; i < iSize/( pBmiHeader->biBitCount / 8); i++)
         {
                   iGrayvalue = int( rgbtri[i].rgbtBlue * 0.11 + rgbtri[i].rgbtGreen * 0.59 + rgbtri[i].rgbtRed * 0.3 );
                   rgbtri[i].rgbtRed   = (BYTE) iGrayvalue;
                   rgbtri[i].rgbtGreen = (BYTE) iGrayvalue;
                   rgbtri[i].rgbtBlue  = (BYTE) iGrayvalue;
         }
         DrawPic();
}

在上述代码中,通过遍历每一个像素,然后计算该像素的三个分量的加权平均值,将三个分量设置成同一个值,这样就实现了对图像的灰度化处理。

4.模糊化

其实所谓的模糊化,就是将各个像素的相邻的像素的各个分量的值相加,然后除以2就可以实现对图像的模糊处理。

下面给出代码:

//模糊化
void CBMPSampleDlg::Blur(){
         m_Dib.AttachMapFile("1.bmp", TRUE);
         m_Dib.CopyToMapFile("模糊化.bmp");
         RGBTRIPLE *rgbtri = (RGBTRIPLE *)m_Dib.m_lpImage;
         int iSize = m_Dib.GetSizeImage();
         BITMAPINFOHEADER * pBmiHeader = (BITMAPINFOHEADER *)m_Dib.m_lpBMIH;
         LONG lHeight = pBmiHeader->biHeight;
         LONG lWidth = pBmiHeader->biWidth;
         for (int y = 0 ; y < lHeight; y++) {
                   for (int x = 2 ; x < lWidth; x++, rgbtri ++) {
                            rgbtri->rgbtRed   = (BYTE) ((rgbtri->rgbtRed + rgbtri[2].rgbtRed) >> 1);
                            rgbtri->rgbtGreen = (BYTE) ((rgbtri->rgbtGreen + rgbtri[2].rgbtGreen) >> 1);
                            rgbtri->rgbtBlue  = (BYTE) ((rgbtri->rgbtBlue + rgbtri[2].rgbtBlue) >> 1);
                   }
                   rgbtri +=2;
         }
         DrawPic();
}

上面的代码同样是遍历每一个像素将前一个像素和后一个像素相加,然后将获得的值右移一位,这样就能实现除以2的效果,之所以做位运算,是因为位运算的速度比除法运算要快很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/646017.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

布鲁可冲刺上市:极其依赖第三方,多个授权将到期,朱伟松突击“套现”

“奥特曼”概念股来了。 近日&#xff0c;布鲁可集团有限公司&#xff08;下称“布鲁可”&#xff09;递交招股书&#xff0c;准备在港交所主板上市&#xff0c;高盛和华泰国际为其联席保荐人。据贝多财经了解&#xff0c;布鲁可的经营主体为上海布鲁可科技集团有限公司。 天眼…

Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器

​【应用名称】&#xff1a;Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器 ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#Kiwi ​【应用版本】&#xff1a;124.0.6327.2 ​【应用大小】&#xff1a;233MB ​【软件说明】&#xff1a;一款基于开源项目 Chr…

【Qt 学习笔记】Qt窗口 | 菜单栏 | QMenuBar的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 菜单栏 | QMenuBar的使用及说明 文章编号&#xff1a;Qt 学习…

Python 小游戏——贪吃蛇

Python 小游戏——贪吃蛇 文章目录 Python 小游戏——贪吃蛇项目介绍环境配置代码设计思路1. 初始化和变量定义2. 创建游戏窗口和FPS控制器3. 初始化贪吃蛇和食物的位置4. 控制贪吃蛇的方向和分数5. 主游戏循环 难点分析源代码呈现代码结果 项目介绍 贪吃蛇游戏是一款通过上下…

解析售后维修服务平台如何助力企业高效运营与决策

随着生活质量的不断提高&#xff0c;人们对于售后服务的要求也越来越多。因此&#xff0c;售后服务已经成为企业竞争力的重要组成部分。售后服务平台作为连接企业与消费者的桥梁&#xff0c;不仅关乎着消费者的满意度&#xff0c;而且直接影响着企业的品牌形象与市场地位。那么…

音视频学习规划

文章目录 概述闲聊点 小结 概述 最近在学习音视频&#xff0c;觉得还是要先写个提纲&#xff0c;给自己制定下学习路线及目标。先写下我的个人流程及思路。 ffmpeg的命令ffmpeg api播放器流媒体RTMP&#xff0c;HLS 闲聊点 先说下学习命令行吧&#xff0c;学习命令行是为了…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第29课-会员制展厅

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第29课-会员制展厅 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

记一次安卓“Low on memory“崩溃问题

前言 最近再调人脸识别算法相关demo,发现调试期间总是偶发性崩溃&#xff0c;捕获不到异常的那种&#xff0c;看日志发现原因是Low on memory&#xff0c;一开始还疑惑 App内存不够应该是OOM啊,怎么会出现这种问题&#xff0c;百思不得其解&#xff0c;直到我打开了 Android s…

HTML+CSS+JS(web前端大作业)~致敬鸟山明简略版

HTMLCSSJS【动漫网站】网页设计期末课程大作业 web前端开发技术 web课程设计 文章目录 一、网站题目 二、网站描述 三、网站介绍 四、网站效果 五、 网站代码 文章目录 一、 网站题目 动漫网站-鸟山明-龙珠超 二、 网站描述 页面分为页头、菜单导航栏&#xff08;最好可下拉&…

Web Server项目实战2-Linux上的五种IO模型

上一节内容的补充&#xff1a;I/O多路复用是同步的&#xff0c;只有调用某些API才是异步的 Unix/Linux上的五种IO模型 a.阻塞 blocking 调用者调用了某个函数&#xff0c;等待这个函数返回&#xff0c;期间什么也不做&#xff0c;不停地去检查这个函数有没有返回&#xff0c…

前端---闭包【防抖以及节流】----面试高频!

1.什么闭包 释放闭包 从以上看出&#xff1a;一般函数调用一次会把内部的数据进行清除--但是这种操作却可以一起保留局部作用域的数据 // 优点:1、可以读取函数内部的变量 2、让这些变量始中存在局部作用域当中 2.闭包产生的两种业务场景&#xff1a;防抖、节流 2.1防抖 举…

PLC_博图系列☞R_TRIG:检测信号上升沿

PLC_博图系列☞R_TRIG&#xff1a;检测信号上升沿 文章目录 PLC_博图系列☞R_TRIG&#xff1a;检测信号上升沿背景介绍R_TRIG&#xff1a; 检测信号上升沿说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 R_TRIG 背景介绍 这是一篇关于PLC编程的文章&a…

【微服务】springboot 构建镜像多种模式使用详解

目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …

Neural Networks and Deep Learning环境搭建

1.进入Anaconda prompt 2.创建虚拟环境 &#xff08;1&#xff09;最简单的创建 python 虚拟环境的命令是&#xff1a; conda create -n your_env_name # your_env_name 为你虚拟环境名&#xff08;2&#xff09;我在这里创建一个名为&#xff1a;deep_study的 python2.7版…

Outlook关闭垃圾邮件过滤的方法

Outlook关闭垃圾邮件过滤的方法 | LogDicthttps://www.logdict.com/archives/outlookguan-bi-la-ji-you-jian-guo-lu-de-fang-fa

解决vite打包只生成了一个css和js文件问题

文章目录 1. 打包遇到的问题2. 问题原因及修改3. 调整后再次打包&#x1f197; 1. 打包遇到的问题 今天整了一个项目&#xff0c;试了下打包&#xff0c;发下打包后只生成了一个css文件&#xff0c;和一个js文件&#xff0c; 这样肯定是不行的&#xff0c;因为这样这个文件的包…

CSS常用设置

对于前端开发人员来说&#xff0c;最难的一步莫过于CSS&#xff08;是否同感&#xff1f;&#xff09; 在最近的项目中学习了一些CSS设置&#xff0c;特意来分享~ 容器内容水平垂直居中 先准备个容器和内容&#xff08;一个盒子&#xff09; <div id"app">…

Elasticsearch集群许可证过期问题解决方法汇总

最近在使用elasticsearch的过程中,使用elastic-head进行可视化展示集群的状态和信息,从2024年5月18日突然elastic-head无法现在集群的状态界面啦,elasticsearch集群状态是正常,命令如下: curl -X GET "localhost:9200/_cluster/health?pretty" 在google页面上通过…

JavaWeb-JS

目录 学习重点 什么是 JavaScript? Web标准 JS的引入方式 JS的基本语法 JS的函数 JS的对象 JS事件监听 学习重点 js 引入方式 js 基础语法 js 函数 js 对象 js 事件监听 什么是 JavaScript? Web标准 Web 标准也称为网页标准 &#xff0c;由一系列的标准组成&#xff0…

Java面试题--JVM大厂篇(1-10)

引言&#xff1a; 在这个信息时代&#xff0c;对于准备进入大厂工作的朋友们来说&#xff0c;对于JVM&#xff08;Java虚拟机&#xff09;的掌握是面试中的一项重要内容。下面是一些精选的JVM面试题&#xff0c;希望对大家能有所帮助。 正文&#xff1a; 1. JVM有哪几种垃圾收…