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

文章目录

前言

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:8c80f96a-5a33-44e6-a154-6056890bac9e

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:2332f54d-2211-4114-9975-012c38c31a09

* 源码地址在文末

对比度和亮度调整实验

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

  • 问题一
  • 问题:只知道使用 sigmoid 函数,不知道使用一个什么样的 sigmoid 函数比较合适
  • 解决:上网搜寻,了解到对比度和亮度的一般调节公式为:在进行对比度调整时,会在像素值前面增加一个与其相乘的系数。在亮度调整时,会使用一个变量与像素值相加减
  • 问题二:
  • 问题:只考虑了 sigmoid 函数的变化趋势,而没有考虑到具体的值,函数值只在[-5,5]内有明显变化
  • 解决:在像素变换公式上进行调整
    • 原始公式为
int t = source_image.at(y, x)[c];
transformed_image.at(y, x)[c] = saturate_cast(t * ((contrast_value*0.1 / (1.00 + exp(-t))) + 1));
+ 调整后公式为
double t = ((source_image.at(y, x)[c] - 127) / 255.00) * contrast_value * 0.1;//[-10, 10]
transformed_image.at(y, x)[c] = saturate_cast(source_image.at(y, x)[c] * ((1.00 / (1.00 + exp(-t))) + 0.3) + bright_value - 100);
+ -127是为了让结果有正有负,这样像素小的会导致 1 + e − t 1+e^{-t}1 +e −t 更大,对比度调整之后,像素值更小。反之,像素值大的调整的程度不像像素值小的那样剧烈,因此会导致他们之间的像素差更大,因此对比度得到调整
+ /255 是为了限制 t t t 的范围,使其尽量在幂函数变化范围较明显的区域变动
+ contrast_value 就是滑动条需要改变的值,用于进行对比度调整
+ 1 1 + e − t + 0.3 \frac{1}{1+e^{-t}} + 0.3 1 +e −t 1 ​+0.3 ,加了一个系数是因为,如果不加系数的话,只调整对比度会导致变换后的像素值永远小于原像素值,这不是我们想要的。另一个原因是,这个可以平衡一下 t t t 的作用,不让 t t t 的影响程度这么大。(加的数值大小可以自行控制)
+ bright_value 比较好理解,就是单纯对像素值进行调整,用于亮度调整

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:fe02ce56-84ac-4ec4-ae4c-89db2eca6e5b

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:1c2e32d2-958a-4c7a-9822-898ac75956f8

结果分析与体会

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:1ce1a2d7-0b31-4a6a-8e34-d49cf72b5e98

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:4c39f0c8-be48-410f-ba81-17a070f47cde

  • 使用sigmoid函数难以得到原图
    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:08fcb090-df1f-4698-baf1-ca2e3a7451cc
    [En]

    [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:fcf865e2-3f2b-4170-b52d-26b3e285a34b

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

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

; 背景相减实验

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

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

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

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:85aa624c-e179-443f-b4f3-854687b9208e

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:c78738ff-25be-48cb-bba7-9e7a8b282ca5

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:0f241aca-38b2-464e-b0e9-d58a42e13a90

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:03344e6a-8ff6-41be-90f8-1e3c65621e09

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

; 结果分析与体会

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:b0413385-8c83-4887-a3be-3263ae0a63cb

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:5971c7c3-3a26-47f8-9da6-08ee8bd0d20c

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:502f17f5-a46c-4f83-a413-95dc402bb5cb

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:39f9ff11-e8fb-4c5e-bbdc-564bf25cdc8d

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

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

遇到的知识点

at函数

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

常见类型Vec3b

Vec3b可以看作是vector

由于在OpenCV中,使用imread读取到的Mat图像数据,都是用uchar类型的数据存储,对于RGB三通道的图像,每个点的数据都是一个Vec3b类型的数据。使用at定位方法如下:

img.at(row, col)[0] = 255;  // 这是指修改B通道数据
img.at(row, col)[1] = 255;  // 这是指修改G通道数据
img.at(row, col)[2] = 255;  // 这是指修改R通道数据

point

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

saturate_cast

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

Mat::zeros

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:ed8285d0-a2e9-469f-9230-b12bbd65af09

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:f33a3a1a-f711-4d84-b6d6-15327f036ecd

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(y, x)[c] - 127) / 225.00) * contrast_value * 0.1;
                transformed_image.at(y, x)[c] = saturate_cast(source_image.at(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)

Original: https://blog.csdn.net/qq_52852138/article/details/127038134
Author: 长命百岁️
Title: 山东大学数字图像处理实验(二)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/561352/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球