当前位置: 首页 > news >正文

山东大学数字图像处理实验(二)

文章目录

  • 前言
  • 对比度和亮度调整实验
    • 实验过程中遇到和解决的问题
    • 结果分析与体会
  • 背景相减实验
    • 实验过程中遇到和解决的问题
    • 结果分析与体会
  • 遇到的知识点
      • at函数
      • 常见类型Vec3b
      • point
      • saturate_cast <uchar>
      • Mat::zeros
      • createTrackbar

前言

  • 本次为《对比度和亮度调整》与《背景相减两个实验》
  • 源码地址在文末

对比度和亮度调整实验

实验过程中遇到和解决的问题

  • 问题一

    • 问题:只知道使用 sigmoid 函数,不知道使用一个什么样的 sigmoid 函数比较合适
    • 解决:上网搜寻,了解到对比度和亮度的一般调节公式为:在进行对比度调整时,会在像素值前面增加一个与其相乘的系数。在亮度调整时,会使用一个变量与像素值相加减
  • 问题二:

    • 问题:只考虑了 sigmoid 函数的变化趋势,而没有考虑到具体的值,函数值只在[-5,5]内有明显变化

    • 解决:在像素变换公式上进行调整

      • 原始公式为

        int t = source_image.at<Vec3b>(y, x)[c];
        transformed_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(t * ((contrast_value*0.1 / (1.00 + exp(-t))) + 1));
        
      • 调整后公式为

        double t = ((source_image.at<Vec3b>(y, x)[c] - 127) / 255.00) * contrast_value * 0.1;//[-10, 10]
        transformed_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(source_image.at<Vec3b>(y, x)[c] * ((1.00 / (1.00 + exp(-t))) + 0.3) + bright_value - 100);
        
      • -127是为了让结果有正有负,这样像素小的会导致 1 + e − t 1+e^{-t} 1+et 更大,对比度调整之后,像素值更小。反之,像素值大的调整的程度不像像素值小的那样剧烈,因此会导致他们之间的像素差更大,因此对比度得到调整

      • /255 是为了限制 t t t 的范围,使其尽量在幂函数变化范围较明显的区域变动

      • contrast_value 就是滑动条需要改变的值,用于进行对比度调整

      • 1 1 + e − t + 0.3 \frac{1}{1+e^{-t}} + 0.3 1+et1+0.3 ,加了一个系数是因为,如果不加系数的话,只调整对比度会导致变换后的像素值永远小于原像素值,这不是我们想要的。另一个原因是,这个可以平衡一下 t t t 的作用,不让 t t t 的影响程度这么大。(加的数值大小可以自行控制)

      • bright_value 比较好理解,就是单纯对像素值进行调整,用于亮度调整

  • 问题三:利用调整公式,难以得到原图。个人认为是因为用了非线性变换,目前没有解决

结果分析与体会

调整效果比较明显,且都比较正常,实验结果达到预期效果

  • 使用sigmoid函数难以得到原图

  • 对比度超过一定范围就会丢失图像的真实感
    在这里插入图片描述

在这里插入图片描述

背景相减实验

实验过程中遇到和解决的问题

  • 问题一

    • 问题:两张图像对应位置像素相减得到图片效果很差

在这里插入图片描述
误检:

  • 当图像中的像素值和背景图中对应位置像素值相差不大时,难以进行分辨,相减后前景图该位置基本为黑色,不符合预期要求。

  • 以上述图片为例,当人身上的像素值小于背景像素值时,人的像素值减去背景像素值通过防止溢出处理后,结果图像对应位置像素值为0,不符合预期要求。

    • 解决:寻找更好的解决方案,使用中值滤波去除噪声点。通过将两张图片每个像素点的三个通道的差值平方求和得到sum,然后再对sum开方。手动设定一个阈值,当sum大于这个阈值时,该像素点的三通道都设为255(白色),否则设为0(黑色)。结果发现,阈值去75—100效果最好 , 最终选定阈值为90

结果分析与体会

可以看到,基本将人物这一前景提取出来,但仍有噪声存在

  • 背景相减实验可以多看一些降噪的算法,因为不太容易确定相减的标准

  • 背景相减实验阈值选为90时得到的结果。轮廓清晰,达到预期效果

在这里插入图片描述

遇到的知识点

at函数

  • 对于单通道图像"picture1",picture1.at(i,j)就表示在第i行第j列的像素值。

  • 对于多通道图像如RGB图像"picture2",可以用picture2.at(i,j)[c]来表示某个通道中在(i,j)位置的像素值。

常见类型Vec3b

Vec3b可以看作是vector<uchar, 3> , 简单而言就是一个uchar类型的,长度为3的vector向量。

由于在OpenCV中,使用imread读取到的Mat图像数据,都是用uchar类型的数据存储,对于RGB三通道的图像,每个点的数据都是一个Vec3b类型的数据。使用at定位方法如下:
 
img.at<Vec3b>(row, col)[0] = 255;  // 这是指修改B通道数据
img.at<Vec3b>(row, col)[1] = 255;  // 这是指修改G通道数据
img.at<Vec3b>(row, col)[2] = 255;  // 这是指修改R通道数据

point

srcImage.at<uchar>(j, i) //表示的是  j 行 i 列 的这个像素
srcImage.at<uchar>(Point(j, i)) //表示的是 坐标(j,i)的像素

saturate_cast

  • saturate_cast主要是为了防止颜色溢出操作
  • 在图像处理方面,无论是加是减,乘除,都会超出一个像素灰度值的范围(0~255),saturate_cast函数的作用即是:当运算完之后,结果为负,则转为0,结果超出255,则为255。

Mat::zeros

  • 创建一张图,每个像素的每个通道都为0
Mat m = Mat::zeros(2, 2, CV_8UC3);//直接指明size和类型

transformed_image = Mat::zeros(source_image.size(), source_image.type());//创建一个和source_image一样类型的图

createTrackbar

创建滑动条

  • 回调函数与createTrackbar配合使用
CV_EXPORTS int createTrackbar(const String& trackbarname,
                              const String& winname,
                              int* value, 
                              int count,                                        
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);    
  • 滑动条名字
  • 滑动条所在窗口名字
  • 用来设置滑块的初始值,同时记录滑块以后的位置(用户改变了滑块的位置,因此value值会改变)
  • 轨迹的最大值,滑块可以滑动的范围是[0 , count]
  • 回调函数
  • 默认0,用户传给回调函数的数据,如果第三个值为全局变量,忽略这个值
namedWindow("Transformed Window", WINDOW_AUTOSIZE);
createTrackbar("contrast", "Transformed Window", &contrast_value, 200, ContrastAndBright , 0);
createTrackbar("bright", "Transformed Window", &bright_value, 200, ContrastAndBright , 0);

static void ContrastAndBright(int pos , void* userdata) {
    //value传值给pos , createTrackbar的第六个参数传递给userdata
    for (int y = 0; y < source_image.rows; y++)
        for (int x = 0; x < source_image.cols; x++)
            for (int c = 0; c < 3; c++){
                double t = ((source_image.at<Vec3b>(y, x)[c] - 127) / 225.00) * contrast_value * 0.1;
                transformed_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(source_image.at<Vec3b>(y, x)[c] * ((1.00 / (1.00 + exp(-t))) + 0.3) + bright_value - 100);
            }
    imshow("Display Window", source_image);
    imshow("Transformed Window", transformed_image);
}

源码地址:Computer-Vision/实验一/源码 at main · SDU-NSY/Computer-Vision (github.com)

相关文章:

  • linux多个jdk时,java -version显示的版本有错误
  • 【论文笔记】An Image Patch is a Wave: Phase-Aware Vision MLP
  • 【前端升全栈】 五分钟了解Node.js
  • 部署若依springboot-vue前后端分离项目(Nginx反向代理 2022)
  • Kafka 优化问题
  • 【opencv-c++】windows10系统VisualStudio2022配置opencv_contrib-4.6.0
  • windows安装动力学仿真软件Frost并计算cassie机器人运动学和动力学
  • 使用 SolidJS 和 TypeScript 构建任务跟踪器
  • 【C++】list的模拟实现
  • 【Kotlin基础系列】第4章 类型
  • Vm虚拟机安装Linux系统教程
  • Java设计模式-单列模式
  • 算法 | 算法是什么?深入精讲
  • C++虚函数具体实现机制以及纯虚函数和抽象类(对多态的补充)
  • Trusted Applications介绍
  • canvas 五子棋游戏
  • CSS 专业技巧
  • Cumulo 的 ClojureScript 模块已经成型
  • ES学习笔记(12)--Symbol
  • HTTP那些事
  • k个最大的数及变种小结
  • Linux下的乱码问题
  • PHP那些事儿
  • Python进阶细节
  • STAR法则
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 从零开始学习部署
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 精彩代码 vue.js
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 强力优化Rancher k8s中国区的使用体验
  • 什么软件可以剪辑音乐?
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • ionic入门之数据绑定显示-1
  • Java数据解析之JSON
  • 组复制官方翻译九、Group Replication Technical Details
  • ​批处理文件中的errorlevel用法
  • #162 (Div. 2)
  • #includecmath
  • #NOIP 2014# day.1 T2 联合权值
  • (C语言)fread与fwrite详解
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (论文阅读40-45)图像描述1
  • (南京观海微电子)——COF介绍
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core使用NPOI导出复杂,美观的Excel详解