数字图像处理(番外)图像增强

图像增强

图像增强的方法是通过一定手段对原图像附加一些信息或变换数据,有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征,使图像与视觉响应特性相匹配。

图像对比度

图像对比度计算方式如下:
C = ∑ δ δ ( i , j ) P δ ( i , j ) C=\displaystyle\sum_{{\delta}}\delta(i,j)P_\delta(i,j) C=δδ(i,j)Pδ(i,j)
其中, δ ( i , j ) = ∣ i − j ∣ \delta(i,j)=\lvert i-j\rvert δ(i,j)=ij,即相邻像素间的灰度差; P δ ( i , j ) P_\delta(i,j) Pδ(i,j)为相邻像素灰度差为 δ \delta δ的像素分布概率。可以是四邻域,也可以是八邻域。具体过程如下:
原始图像为:
L = [ 1 3 5 2 1 3 3 6 0 ] L=\begin{bmatrix} 1 & 3 &5\\ 2 & 1 &3 \\ 3 & 6&0 \end{bmatrix} L= 123316530
按照四邻域进行计算,对比度 C L = [ ( 1 2 + 2 2 ) + ( 2 2 + 2 2 + 2 2 ) + ( 1 2 + 1 2 + 1 2 ) + ( 2 2 + 2 2 + 1 2 + 5 2 ) + ( 2 2 + 2 2 + 3 2 ) + ( 1 2 + 3 2 ) + ( 5 2 + 3 2 + 6 2 ) + ( 3 2 + 6 2 ) / 22 C_L=\lbrack(1^2+2^2)+(2^2+2^2+2^2)+(1^2+1^2+1^2)+(2^2+2^2+1^2+5^2)+(2^2+2^2+3^2)+(1^2+3^2)+(5^2+3^2+6^2)+(3^2+6^2)/22 CL=[(12+22)+(22+22+22)+(12+12+12)+(22+22+12+52)+(22+22+32)+(12+32)+(52+32+62)+(32+62)/22。22就是平方的个数。

1.对比度展宽

对比度展宽的目的是通过增强图像的亮暗对比程度而改善画质,使图像的显示效果更加清晰。

线性对比度展宽

通过抑制非重要信息的对比度来腾出空间给重要信息进行对比度的展宽。
在这里插入图片描述
原图的灰度为 f ( i , j ) f(i,j) f(i,j),处理后的图像灰度为 g ( i , j ) g(i,j) g(i,j)。原图中的重要景物的灰度分布假设分布在 [ f a , f b ] \lbrack f_a,f_b\rbrack [fa,fb]的范围内,则对比度线性展宽的目的是使处理后图像的重要景物的灰度分布在 [ g a , g b ] \lbrack g_a,g_b\rbrack [ga,gb]的范围内,当 Δ f = ( f b − f a ) < Δ g = ( g b − g a ) \varDelta f=(f_b-f_a)<\varDelta g=(g_b-g_a) Δf=(fbfa)<Δg=(gbga),则可达到对比度展宽的目的。
计算方式如下:
g ( i , j ) = { α f ( i , j ) 0 ≤ f ( i , j ) < a β ( f ( i , j ) − a ) + g a a ≤ f ( i , j ) < b γ ( f ( i , j ) − b ) + g b b ≤ f ( i , j ) < 255 g(i,j)= \begin{cases} \alpha f(i,j) &\text{ } 0\le f(i,j)<a \\ \beta (f(i,j)-a)+g_a &\text{ } a\le f(i,j)<b \\ \gamma (f(i,j)-b)+g_b &b\le f(i,j)<255 \end{cases} g(i,j)= αf(i,j)β(f(i,j)a)+gaγ(f(i,j)b)+gb 0f(i,j)<a af(i,j)<bbf(i,j)<255
其中, α = g a f a , β = g b − g a f b − f a , γ = 255 − g b 255 − f b \alpha =\frac{g_a}{f_a},\beta =\frac{g_b-g_a}{f_b-f_a},\gamma =\frac{255-g_b}{255-f_b} α=faga,β=fbfagbga,γ=255fb255gb
C++代码如下:

    cv::Mat image = cv::imread("Lena.bmp");cv::Mat grayImage(image.size(), CV_8UC1);cv::Mat dstImage(grayImage.size(), CV_8UC1);cv::cvtColor(image, grayImage, CV_BGR2GRAY);int fa = 50, fb = 100;float ga = 30, gb = 120;for (int row = 0; row < grayImage.rows; row++){uchar *currentData = grayImage.ptr<uchar>(row);for (int col = 0; col < grayImage.cols; col++){if (*(currentData + col) >= 0 && *(currentData + col) < fa){dstImage.at<uchar>(row, col) = uchar(ga / fa * (*(currentData + col)));}if (*(currentData + col) >= fa && *(currentData + col) < fb){dstImage.at<uchar>(row, col) = uchar((gb-ga) / (fb-fa) * (*(currentData + col)-fa)+ga);}if (*(currentData + col) >= fb && *(currentData + col) < 255){dstImage.at<uchar>(row, col) = uchar((255-gb) / (255-fb) * (*(currentData + col)-fb)+gb);}}//currentData++;}

结果如下:
在这里插入图片描述

非线性对比度展宽

通过一个光滑的映射曲线,使得处理后图像的灰度变化比较光滑。计算公式如下:
g ( i , j ) = c ⋅ l g ( 1 + f ( i , j ) ) g(i,j)=c\cdot lg(1+f(i,j)) g(i,j)=clg(1+f(i,j))
实际上完成的作用是,抑制高亮度区域,扩展低亮度区域。

2.直方图均衡化

在信息论中有这样一个结论:当数据的分布接近均匀分布的时候,数据所承载的信息量(熵)为最大。
灰度直方图的基本原理是:对在图像中像素个数多的灰度级(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并。
直方图均衡化方法的具体步骤如下:

  1. 求出原图 f ( i , j ) M × N f(i,j)_{M\times N} f(i,j)M×N的灰度直方图,设用256维的向量 h f h_f hf表示;
  2. h f h_f hf求原图的灰度分布概率,记作 p f p_f pf,则有 p f ( i ) = 1 N f ⋅ h f ( i ) , i = 0 , 1 , … , 255 p_f(i)=\frac{1}{N_f}\cdot h_f(i),i=0,1,\dots ,255 pf(i)=Nf1hf(i),i=0,1,,255
    其中, N f = M × N N_f=M\times N Nf=M×N M , N M,N M,N分别为图像的长和宽)为图像的总像素个数;
  3. 计算图像各个灰度值的累计分布概率,记作 p a p_a pa,则有 p a ( i ) = ∑ k = 0 i p f ( k ) , i = 1 , 2 , … , 255 p_a(i)=\displaystyle\sum_{k=0}^ip_f(k),i=1,2,\dots ,255 pa(i)=k=0ipf(k),i=1,2,,255
    其中,令 p a ( 0 ) = 0 p_a(0)=0 pa(0)=0
  4. 进行直方图均衡化计算,得到处理后图像的像素值 g ( i , j ) g(i,j) g(i,j)为: g ( i , j ) = 255 ⋅ p a ( k ) g(i,j)=255\cdot p_a(k) g(i,j)=255pa(k)

C++代码如下所示:

    cv::Mat image = cv::imread("Lena.bmp");cv::Mat src(image.size(), CV_8UC1);//转为灰度图像cv::cvtColor(image, src, CV_BGR2GRAY);cv::Mat dst(image.size(), CV_8UC1);float hf[256] = { 0 };for (int row = 0; row < src.rows; row++){uchar *currentData = src.ptr<uchar>(row);for (int col = 0; col < src.cols; col++){hf[*(currentData + col)] += 1;}}float pf[256] = { 0 };for (int i = 0; i < 256; i++){pf[i] = hf[i] / (src.rows*src.cols);}float pa[256] = { 0 };for (int i = 1; i < 256; i++){float sumNumber = 0;for (int j = 0; j < i+1; j++){sumNumber += pf[j];}pa[i] = sumNumber;}for (int row = 0; row < dst.rows; row++){uchar * currentData = dst.ptr<uchar>(row);for (int col = 0; col < dst.cols; col++){*(currentData + col) = uchar(255 * pa[src.at<uchar>(row, col)]);}}

结果展示:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7 网络通信(上)

文章目录 网络通信概述ip地址ip的作用ip地址的分类私有ip 掩码和广播地址 linux 命令&#xff08;ping ifconfig&#xff09;查看或配置网卡信息&#xff1a;ifconfig(widows 用ipconfig)测试远程主机连通性&#xff1a;ping路由查看 端口端口是怎样分配的知名端口动态端口 查看…

【数据结构与算法】基数排序

基数排序 基数排序&#xff08;Radix Sort&#xff09;属于“分配式排序”&#xff0c;又称“桶子法”或 bin sort&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。基数排序法是属于稳定性…

【C++】开源:Boost网络库Asio配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

信息安全战线左移!智能网联汽车安全亟需“治未病”

当汽车由典型的工业机械产品逐步发展成为全新的智能移动终端&#xff0c;汽车的安全边界发生了根本性改变&#xff0c;信息安全风险和挑战不断增加。 面对复杂的异构网络、异构系统及车规级特异性要求&#xff0c;智能智能网联汽车信息安全到底要如何防护&#xff0c;已经成为…

八大排序算法--选择排序(动图理解)

选择排序 算法思路 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 选择排序的步骤&#xff1a; 1>首先在未排序序列中找到最小&#xff08;大&#xff09;元素…

基于vue+uniapp微信小程序公司企业后勤服务(设备)系统

本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看公司公告&#xff0c;查看设备&#xff0c;设备入库&#xff0c;查看通讯录&#xff0c;会议室预约&#xff0c;申请出入&#xff0c;申请请假等功能。管理员可以对员工信息&#xff0c;会…

从 0 到 1!得物如何打造通用大模型训练和推理平台

1.背景 近期&#xff0c;GPT 大模型的发布给自然语言处理&#xff08;NLP&#xff09;领域带来了令人震撼的体验。随着这一事件的发生&#xff0c;一系列开源大模型也迅速崛起。依据一些评估机构的评估&#xff0c;这些开源模型大模型的表现也相当不错。一些大模型的评测情况可…

matlab多线程,parfor循环进度,matlab互斥锁

一. 内容简介 matlab多线程&#xff0c;parfor循环进度&#xff0c;matlab互斥锁 二. 软件环境 2.1 matlab 2022b 2.2代码链接 https://gitee.com/JJW_1601897441/csdn 三.主要流程 3.1 matlab多线程 有好几种&#xff0c;最简单的&#xff0c;最好理解的就是parfor&am…

不可错过的家装服务预约小程序商城开发指南

在当今社会&#xff0c;家装行业发展迅速&#xff0c;越来越多的人开始寻求专业的家装预约和咨询服务。对于不懂技术的新手来说&#xff0c;创建一个自己的家装预约咨询平台可能听起来很困难&#xff0c;但实际上通过一些第三方制作平台和工具&#xff0c;这个过程可以变得简单…

复现YOLOv5改进最新MPDIoU:有效和准确的边界盒回归的损失,打败G/E/CIoU,效果明显!!!

MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression 论文简介MPDIoU核心设计思路论文方法实验部分加入YOLOv5代码论文地址:https://arxiv.org/pdf/2307.07662.pdf 论文简介 边界盒回归(Bounding box regression, BBR)广泛应用于目标检测和实例分割,是目标…

Django使用WebSocket

1、websocket 相关 实现一个系统&#xff0c;20 个用户同时打开网站&#xff0c;呈现出来一个群聊界面 解决方案 轮询&#xff1a;让浏览器每隔2s向后台发送一次请求&#xff0c;缺点&#xff1a;延迟&#xff0c;请求太多网站压力大 长轮询&#xff1a;客户端向服务端发送请…

Vue2 第九节 过滤器

&#xff08;1&#xff09;定义&#xff1a;对要显示的数据进行特定格式化后再显示 &#xff08;2&#xff09;语法&#xff1a; ① 注册过滤器 1&#xff09;Vue.filter(name, callback) 全局过滤器 2&#xff09; new Vue({filters:{}}) 局部过滤器 ② 使用过滤器 1&…

14. Spring AOP 的组成和实现

目录 1. Spring AOP 简介 2. AOP 的组成 2.1 切面&#xff08;Aspect&#xff09; 2.2 连接点&#xff08;Join Point&#xff09; 2.3 切点&#xff08;Pointcut&#xff09; 2.4 通知&#xff08;Advice&#xff09; 3. Spring AOP的实现 3.1 新建项目 3.2 添加 AOP …

Stable Doodle:Stability AI推出的一款零门槛AI绘画神器

Stable Doodle是由Stability AI推出的一款零门槛AI绘画神器&#xff0c;可以将简单的草图转化为精美的图像。它可以将随手的塗鴉草稿转化为高畫質的完成圖&#xff0c;让用户能够以更快的速度将想法转化为精美的艺术作品。Stable Doodle利用最新的Stable Diffusion模型&#xf…

C#实现读写CSV文件的方法详解

目录 CSV文件标准 文件示例RFC 4180简化标准读写CSV文件 使用CsvHelper使用自定义方法总结 项目中经常遇到CSV文件的读写需求&#xff0c;其中的难点主要是CSV文件的解析。本文会介绍CsvHelper、TextFieldParser、正则表达式三种解析CSV文件的方法&#xff0c;顺带也会介绍一…

框架的知识点整理

目录 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; 2 、 使用Spring框架有什么好处&#xff1f; 3、Spring MVC 工作原理 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; Spring框架是一个开源的轻量级的Java应用程序开…

x86架构ubuntu22下运行WILL模拟器dophin

0. 环境 i5实体机ubuntu22 1. 安装依赖 $ sudo apt install build-essential git cmake ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libevdev-dev libusb-1.0-0-dev libxrandr-dev libxi-dev libpangocairo-1.0-0 qt6-base-private-dev libblueto…

腾讯云—自动挂载云盘

腾讯云&#xff0c;稍微麻烦了点。 腾讯云服务器&#xff0c;镜像为opencloudos 8。 ### 1、挂载云盘bash #首先通过以下命令&#xff0c;能够看到新的数据盘&#xff0c;如果不能需要通过腾讯云控制台卸载后&#xff0c;重新挂载&#xff0c;并重启服务器。 fdisk -l#为 /dev…

BES2700 SDK绝对时间获取方法

1 代码 2 实验 log 需要换算下

Tensorflow benchmark 实操指南

环境搭建篇见环境搭建-CentOS7下Nvidia Docker容器基于TensorFlow1.15测试GPU_东方狱兔的博客-CSDN博客 1. 下载Benchmarks源码 从 TensorFlow 的 Github 仓库上下载 TensorFlow Benchmarks&#xff0c;可以通过以下命令来下载 https://github.com/tensorflow/benchmarks 我…