visual Studio MFC 平台实现图像增强中Gray-level slicing,Bit-plane slicing,对比度拉伸三种方法

news2025/1/10 20:37:40

MFC 实现图像增强–分段式变换

本文使用visual Studio MFC 平台实现图像增强中的第三大类分段式变换中的三种方法,包括Gray-level slicing,Bit-plane slicing,对比度拉伸.
关于其他MFC单文档工程可参考
01-Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线

02-visual Studio MFC 绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、边框渐变的正方形与填充渐变的正方形实例
03-visual Studio MFC 平台实现对灰度图添加椒盐噪声,并进行均值滤波与中值滤波

文章目录

  • MFC 实现图像增强--分段式变换
    • 一、 Gray-level slicing 灰度级别切片
      • 1.1 灰度级别切片的原理
      • 1.2 灰度级别切片的代码实现
      • 1.3 实现效果
    • 二、 Bit-plane slicing
      • 2.1 Bit-plane slicing 原理
      • 2.2 Bit-plane slicing代码实现
      • 2.3 实现效果
    • 三、 对比度拉伸
      • 3.1 对比度拉伸的原理
      • 3.2 对比度拉伸代码实现
      • 3.3 对比度拉伸的实现图

一、 Gray-level slicing 灰度级别切片

1.1 灰度级别切片的原理

灰度级别切片(Gray-level Slicing)是一种图像处理技术,其目标是增强或突出显示特定灰度范围内的像素值。这通常用于突出感兴趣的目标或特定区域,并抑制其他区域的细节。

以下是灰度级别切片的基本原理:

  1. 选择灰度范围: 定义一个或多个灰度范围,这些范围内的像素将被保留或增强,而其他像素将被抑制。

  2. 设置增强值: 对于选择的灰度范围内的像素,可以将它们的灰度值增强为更高的亮度值,以使其在最终图像中更为突出。

  3. 抑制其他灰度范围: 对于未选择的灰度范围,可以将它们的灰度值设置为较低的亮度值,从而降低它们在最终图像中的显著性。

  4. 生成增强后的图像: 根据上述操作生成最终的图像,其中特定灰度范围内的像素得到了增强,而其他像素则被抑制。

这种方法的应用场景包括:

  • 目标突出显示: 当你想突出显示图像中的某个特定区域或目标时,可以使用灰度级别切片来使该区域更为显著。

  • 降低背景噪声: 如果图像中存在噪声或其他不相关的信息,可以通过灰度级别切片来降低这些不相关信息的影响。

1.2 灰度级别切片的代码实现

void CMFCApplication1View::OnGrayLevelSlicing()
{
    if (gray_data != nullptr) {
        unsigned char* enhanced_data = new unsigned char[bmpWidth * bmpHeight];
        int lower_threshold = 100;  // 定义下限阈值
        int upper_threshold = 200;  // 定义上限阈值

        for (int i = 0; i < bmpWidth * bmpHeight; ++i) {
            if (gray_data[i] >= lower_threshold && gray_data[i] <= upper_threshold) {
                // 在选择的灰度范围内增强像素值
                enhanced_data[i] = 255;
            } else {
                // 在其他范围内抑制像素值
                enhanced_data[i] = 0;
            }
        }

        // 获取绘图设备
        CClientDC dc(this);
        CDC* pDC = &dc;

        // 绘制增强后的灰度图
        m_pBmp->drawGrayBmp(pDC, enhanced_data, bmpWidth, bmpHeight, offset_left + 1100, offset_top);

        // 在图片下方添加文字
        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);
        {
            Graphics graphics(pDC->m_hDC);
            Gdiplus::Font font(L"Arial", 12);
            SolidBrush brush(Color(255, 128, 0, 128));  // 文字颜色为紫色

            // 文字的位置
            PointF point(offset_left + 1100, offset_top + bmpHeight + 10);

            // 绘制文字
            graphics.DrawString(L"灰度级别切片", -1, &font, point, &brush);
        }
        GdiplusShutdown(gdiplusToken);

        // 释放内存
        delete[] enhanced_data;
    } else {
        // 处理图像未加载的情况
        AfxMessageBox(_T("未加载图片"));
    }
}

上述代码将在图像中选择一个灰度范围进行增强,并在最终图像中突出显示该范围。

1.3 实现效果

在这里插入图片描述

二、 Bit-plane slicing

2.1 Bit-plane slicing 原理

Bit-plane slicing 是一种图像处理技术,它将图像的每个像素的二进制表示按位切割,然后将每个位平面(bit plane)单独显示。这种技术可以用于分析和可视化图像的信息,从而更好地理解图像的结构和特征。

以下是 Bit-plane slicing 的基本原理:

  1. 二进制表示: 对于每个像素,将其灰度值转换为二进制表示。例如,8 位灰度图像的像素值在二进制中有 8 位。

  2. 按位切割: 对每个像素的二进制表示,将其按位进行切割。例如,一个像素的 8 位二进制表示可以分为 8 个位平面,每个平面代表一个二进制位。

  3. 单独显示: 将切割得到的每个位平面单独显示。这意味着显示第一位平面、第二位平面,以此类推。

  4. 可视化: 通过观察每个位平面的图像,可以更好地理解图像的结构和像素之间的关系。低位平面通常包含图像的全局信息,而高位平面包含更多的细节信息。

  5. 合成: 可以选择将其中一些位平面重新合成为新的图像,以突出显示某些特定特征或信息。

Bit-plane slicing 主要用于图像分析、图像压缩和图像增强。在分析中,它可以帮助识别图像中的模式和结构。在压缩中,某些位平面可以舍弃以减小图像的大小。在增强中,选择特定位平面可以突出显示某些特征。

2.2 Bit-plane slicing代码实现

void CMFCApplication1View::OnBitplaneSlicing()
{
    if (gray_data != nullptr) {
        // 获取绘图设备
        CClientDC dc(this);
        CDC* pDC = &dc;

        // 选择要显示的位平面,这里选择第 3 位平面(从右往左数)
        int bit_plane = 3;

        // 创建临时数组用于存储位平面数据
        unsigned char* bit_plane_data = new unsigned char[bmpWidth * bmpHeight];

        // 提取位平面数据
        for (int i = 0; i < bmpWidth * bmpHeight; ++i) {
            bit_plane_data[i] = (gray_data[i] >> bit_plane) & 1;
        }

        // 缩放位平面数据以便显示
        int scale_factor = 255;
        for (int i = 0; i < bmpWidth * bmpHeight; ++i) {
            bit_plane_data[i] *= scale_factor;
        }

        // 绘制位平面图像
        m_pBmp->drawGrayBmp(pDC, bit_plane_data, bmpWidth, bmpHeight, offset_left + 1300, offset_top);

        // 在图片下方添加文字
        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);
        {
            Graphics graphics(pDC->m_hDC);
            Gdiplus::Font font(L"Arial", 12);
            SolidBrush brush(Color(255, 128, 0, 128));  // 文字颜色为紫色

            // 文字的位置
            PointF point(offset_left + 1300, offset_top + bmpHeight + 10);

            // 绘制文字
            CString text;
            text.Format(L"Bit-plane Slicing (Bit %d)", bit_plane);
            graphics.DrawString(text, -1, &font, point, &brush);
        }
        GdiplusShutdown(gdiplusToken);

        // 释放内存
        delete[] bit_plane_data;
    } else {
        // 处理图像未加载的情况
        AfxMessageBox(_T("未加载图片"));
    }
}

上述代码演示了如何选择特定位平面进行切割并显示。在示例中,选择了第 3 位平面,并在图像下方显示了相应的文字。请注意,位平面的选择从右向左进行,从 0 开始。

2.3 实现效果

 

三、 对比度拉伸

3.1 对比度拉伸的原理

图像的对比度拉伸是一种调整图像对比度的方法,其原理涉及到像素值的映射。对比度表示图像中不同亮度级别之间的差异程度。拉伸对比度的目的是增强图像中的亮度差异,使图像中的细节更加明显。

对比度拉伸的一般原理如下:

  1. 找到图像的最小和最大像素值: 遍历整个图像,找到最小和最大的像素值。

  2. 定义拉伸函数: 根据找到的最小和最大像素值,定义一个拉伸函数,将原始像素值映射到一个新的范围内。这个映射通常使用线性函数完成,将原始像素值拉伸到一个更广泛的范围。

    公式示例: 新像素值 = ( 原始像素值 − 最小值 最大值 − 最小值 ) × 新范围大小 \text{新像素值} = \left( \frac{\text{原始像素值} - \text{最小值}}{\text{最大值} - \text{最小值}} \right) \times \text{新范围大小} 新像素值=(最大值最小值原始像素值最小值)×新范围大小

  3. 应用拉伸函数: 将拉伸函数应用于整个图像,调整每个像素的值。这样,原始图像中的亮度差异将在新的范围内更为明显。

对比度拉伸常用于增强图像中的细节,特别是在图像中存在大量像素集中在低对比度范围内的情况。拉伸过程不改变图像的相对亮度顺序,只是将亮度范围映射到更广泛的范围,以便更好地显示图像的细节。

3.2 对比度拉伸代码实现

//对比度拉伸代码
void CMFCApplication1View::OnContraststretching()
{
 
 CClientDC dc(this);
 CDC* pDC = &dc;
 if (gray_data != nullptr) {
  // 寻找图像的最小和最大像素值
  unsigned int minPixelValue = gray_data[0];
  unsigned int maxPixelValue = gray_data[0];
  // 创建临时数组用于对比度拉伸处理
  unsigned char* temp_data = new unsigned char[bmpWidth * bmpHeight];
  for (int i = 0; i < bmpWidth * bmpHeight; ++i) {
   if (gray_data[i] < minPixelValue) {
    minPixelValue = gray_data[i];
   }

   if (gray_data[i] > maxPixelValue) {
    maxPixelValue = gray_data[i];
   }
  }

  // 对比度拉伸的参数
  const int newMinPixelValue = 0;
  const int newMaxPixelValue = 255;

  // 应用对比度拉伸公式到每个像素
  for (int i = 0; i < bmpWidth * bmpHeight; ++i) {
   temp_data[i] = static_cast<unsigned char>(
    (gray_data[i] - minPixelValue) * (newMaxPixelValue - newMinPixelValue) /
    (maxPixelValue - minPixelValue) + newMinPixelValue);
  }

  // 绘制拉伸后的灰度图
  m_pBmp->drawGrayBmp(pDC, temp_data, bmpWidth, bmpHeight, offset_left + 450, offset_top);
  // 释放临时数组内存
  delete[] temp_data;
  // 更新视图,显示修改后的图像
  //Invalidate();
  // 在图片下方添加文字---只为方便查看
  GdiplusStartupInput gdiplusStartupInput;
  ULONG_PTR gdiplusToken;
  GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);
  {
  Graphics graphics(pDC->m_hDC);
  Gdiplus::Font font(L"Arial", 12);
  SolidBrush brush(Color(255,128, 0, 128));  // 文字颜色为紫色

  // 文字的位置
  PointF point(offset_left + 450, offset_top + bmpHeight + 10);

  // 绘制文字
  graphics.DrawString(L"对比度拉伸后的图", -1, &font, point, &brush);
  }
  GdiplusShutdown(gdiplusToken);

 }
 else {
  // 处理图像未加载的情况
  AfxMessageBox(_T("未加载图片"));
  return;
 }
}

3.3 对比度拉伸的实现图

在这里插入图片描述

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

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

相关文章

ES-深入理解倒排索引

倒排索引 idproductdesc1新版 小米 至尊-纪念版手机1小米 NFC 手机3NFC手机4小米 耳机5华为 耳机6扫地机器人7华为 Mata………………term_indexterm dictionaryposting list------------------------------------小米1……100W华为6,7,9NFC76,90耳机5352红米643,98机器人645,9…

【开源】基于JAVA语言的考研专业课程管理系统

项目编号&#xff1a; S 035 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S035&#xff0c;文末获取源码。} 项目编号&#xff1a;S035&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高…

SSM项目实战-POJO设计

1、schedule_db.sql CREATE DATABASE schedule_db CHARACTER SET utf8 ;USE schedule_db;CREATE TABLE sys_schedule (sid int NOT NULL AUTO_INCREMENT COMMENT 日程id,uid int DEFAULT NULL COMMENT 用户id,title varchar(50) DEFAULT NULL COMMENT 标题,completed int DEFAU…

浅学指针(4)函数指针数组和qsort的使用

系列文章目录 文章目录 系列文章目录前言1.函数指针数组的⽤途作用&#xff1a;可以让代码更简洁&#xff0c;逻辑更清晰 2. 回调函数回调函数就是⼀个通过函数指针调⽤的函数 3 . qsort函数qsort函数可以排序所有数据类型解释如图&#xff1a;![在这里插入图片描述](https://i…

CAP概念和三种情况、Redis和分布式事务的权衡

借鉴&#xff1a;https://cloud.tencent.com/developer/article/1840206 https://www.cnblogs.com/huanghuanghui/p/9592016.html 一&#xff1a;CAP概念和三种情况 1.概念&#xff1a; C全称Consistency&#xff08;一致性&#xff09;&#xff1a;这个表示所有节点返回的数…

基于SpringBoot高校心理教育辅导设计与实现

摘 要 随着Internet技术的发展&#xff0c;心理教育辅导系统应运而生&#xff0c;心理教育辅导系统为用户提供了一个更为便利的心理测试咨询平台。所以&#xff0c;为了充分满足高校学生心理教育辅导的需求&#xff0c;特开发了本高校心理教育辅导系统。 本高校心理教育辅导系统…

喜报 | 通付盾WAAP解决方案入选国家工业信息安全发展研究中心“2023年数字化转型自主创新解决方案优选案例”

为提升自主创新产品质量和技术创新能力&#xff0c;助力重点行业自主可控基础设施建设&#xff0c;加速重点行业数字化转型工作进程&#xff0c;促进重点行业产业链数字化升级&#xff0c;推动重点行业数字化、网络化、智能化发展。国家工业信息安全发展研究中心联合中国交通建…

CentOS系统环境搭建(二十二)——Git进阶

centos系统环境搭建专栏&#x1f517;点击跳转 文章目录 Git进阶1.更新代码2.只拉取Git仓库的部分目录内容2.1初始化空白仓库2.2配置git仓库2.3开启稀疏检出属性2.4设置指定拉取的目录2.5 更新代码 Git进阶 1.更新代码 基于上一篇文章CentOS系统环境搭建&#xff08;二十一&…

[Android]AlertDialog对话框

1.介绍AlertDialog AlertDialog是Android中常用的对话框组件之一&#xff0c;用于在应用程序中显示一些提示信息、警告、确认信息或者提供用户进行选择的界面。AlertDialog通常用于与用户进行交互&#xff0c;例如要求用户确认某个操作、输入一些信息或者从一组选项中选择一个。…

从文字到使用,一文读懂Kafka服务

文章目录 1. 什么是Kafka&#xff1f; 2. Kafka有什么特点&#xff0c;优缺点是什么&#xff1f; 3. Kafka 与 Zookeeper 服务的关系&#xff1f; 4. Kafka 的常见命令有哪些&#xff1f;5. Kafka 和 Zookeeper 服务如何结合&#xff1f;6. Kafka 生产者和消费者的流程图&#…

四川枢震栩电商:抖店的商品标题怎么设置?

在抖店平台上&#xff0c;商品标题是吸引顾客点击和购买的重要因素之一。一个好的商品标题能够吸引顾客的注意&#xff0c;准确传达商品的特点和卖点。那么&#xff0c;如何设置抖店的商品标题呢&#xff1f; 一、抖店的商品标题怎么设置&#xff1f; 首先&#xff0c;简洁明了…

单片机实验(三)

前言 实验一&#xff1a;利用定时器T1的中断控制P1.7引脚输出音频信号&#xff0c;启动蜂鸣器发出一段熟悉的与众不同的具有10个音节的音乐音频。 实验二&#xff1a;使用定时器/计数器来实现一个LCD显示年、月、日、星期 、时、分、秒的电子表&#xff0c;要求时和分可以方便…

云服务器anaconda(py39)+pytorch1.12.0(cu113)

用xshell连接ip地址&#xff0c;端口号22&#xff0c;输入用户密码 查看当前版本 conda -V conda info --envs 如果不是需要的版本&#xff0c;使用 anaconda-clean --yes rm -rf anaconda3 删除文件夹 安装anaconda 2022 10 py3.9 wget https://repo.anaconda.com/archi…

kafka 集群 ZooKeeper 模式搭建

Apache Kafka是一个开源分布式事件流平台&#xff0c;被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用程序 Kafka 官网&#xff1a;Apache Kafka 关于ZooKeeper的弃用 根据 Kafka官网信息&#xff0c;随着Apache Kafka 3.5版本的发布&#xff0c;Zookeeper现…

看这里!精确的用户画像是如何一步步构建的?

1. 用户画像的定义 用户画像是指根据用户的个人信息、行为特征和偏好等数据来描绘和分析用户的一种方法。它是通过收集和分析用户的各种数据&#xff0c;以便更好地了解用户需求和行为模式&#xff0c;从而为企业提供个性化、精准化的产品和服务。 2. 构建用户画像的步骤 &…

If和else的紧缩版本(Python)

epsilon_max 3 epsilon 2 epsilon_increment 1 epsilon epsilon * (1 epsilon_increment) if epsilon < epsilon_max else epsilon_max print(epsilon)

读书笔记-《数据结构与算法》-摘要1[数据结构]

文章目录 [数据结构]1. String - 字符串2. Linked List - 链表2.1 链表的基本操作2.1.1 反转链表单向链表双向链表 2.1.2 删除链表中的某个节点2.1.3 链表指针的鲁棒性2.1.4 快慢指针 3. Binary Tree - 二叉树3.1 树的遍历3.2 Binary Search Tree - 二叉查找树 4. Queue - 队列…

训练 CNN 对 CIFAR-10 数据中的图像进行分类-keras实现

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …

桶装水订水送水小程序具备以下主要功能

桶装水订水送水小程序具备以下主要功能&#xff1a; 对比传统的电话订水&#xff0c;订水小程序展现出显著的优势&#xff1a; 1. 便捷性&#xff1a;用户通过小程序就能轻松预订水桶&#xff0c;无需亲自出门&#xff0c;极大提升了生活的便捷度。 2. 即时性&#xff1a;送水…

element-ui表格滚动效果,el-table滚动条样式重置

项目首页需要展示一个表格滚动区域&#xff0c;特此来记录一下 HTML <div class"table-box" mouseenter"mouseenter" mouseleave"mouseleave"><el-table :data"tableList" border height"400px" v-loading"…