从 QFramework 重新开始

您所在的位置:网站首页 3dmax2022明暗处理有阴影 从 QFramework 重新开始

从 QFramework 重新开始

2023-02-01 22:33| 来源: 网络整理| 查看: 265

自从上一篇博文写完后,就进入了繁忙工作状态,直到最近才开始有一点空闲时间。

这次繁忙的状态从 2022 年 10 月 11 日 持续到 2022 年 11 月 5 日。

主要的工作就是 QFramework 相关的内容发布、第五届小班招生 和 双十一活动的准备。

三件事堆在了一起,很酸爽。

三件事中的 QFramework 相关的内容发布其实是可以等双十一结束之后再去做的,但是我最近意识到,现在是开始大力推进 QFramework 的最好时机,所以不想错过这个机会。

为什么现在是开始大力推进 QFramework 的最好时机?

因为我需要的技能点刚好点完了。

其实这次推进 QFramework 之前,差不多有两年的时间没有给 QFramework 增加新特性。

而这两年的时间我做了什么事情呢?

第一年也就是 2021 年,我到 Unity 中文课堂开始出一些视频教程,因为在 2021 年之前我的教程都是文字版,一直在点文字教程的技能。所以希望到 Unity 中文课堂出一些视频教程,去积累并学习一些出视频教程的经验。当然我在 2018 年左右也是出了一年多的视频经验的,但是一直对自己视频教程的质量不满意,觉得自己不擅长视频教程可能更擅长写文字教程,所以就转投写文字教程了。而在中文课堂的这一年,做视频教程方面确实得到了不少提升。

第一年主要就是尝试出一些视频教程,然后点视频教程的技能。

第二年也就是 2022 年,就是今年,今年花了 8 个月的时间在出一门独立游戏的视频教程上,为了出这门课又啃了很多独立游戏和游戏设计相关的资料,然后也在 steam 上架了三款独立游戏。主要是为了点 游戏设计 和 游戏制作、像素画这三个技能,多积累一些制作经验。

然后休息了一阵子,做了一些促销活动,时间转眼就到了 10 月份。

这个时候发现,自己积攒了不少做视频教程的经验,然后也有游戏设计、游戏制作、像素画的经验,那么出 QFramework 的案例教程的条件就非常充足了。

其实自己在刚做教程的时候就想过出一些 QFramework 的案例教程,但是那个时候觉得,如果出一个 QFramework 案例教程,游戏又没啥可玩性也没啥亮点,美术问题也不知道怎么搞定,怕做出来的东西平平庸庸,和别人一样,那还不如不做呢。于是就一直没有出,而当时也有一些同行讲师问我为啥不错一些 QFramework 的实战教程,那样的话我只要靠 QFramework 就可以产一堆实战课了,我也都回答了以上原因。

而在 10 月份的时候发现,时机成熟了,于是就开始发 QFramework 相关的内容。

每天动力很足,甚至有一天在 b 站一口气发了 7 个视频。。。。

现在是 30 岁的末尾了,在 30 岁之前,做了很多探索和尝试,不管是技术上、兴趣爱好上、还是其他领域尝试了非常多的东西,这里就不一一列举了,而第一个尝试的事情就是业余时间写框架,也就是 QFramework,写了框架尝试给 QFramework 写原理教程,也就是 框架搭建 系列,然后开始出框架搭建的视频教程,后来就出来做讲师,然后开自己的班级,自己写班级系统,去研究和学习做产品,再到今年做独立游戏。

而在 30 岁的末尾,自己梦寐以求的独立游戏理想终于算是入门了,从客观上来说已经上架了 3 款 steam 独立游戏算是理想实现了,但是从感兴上来说自己可以还想做,而且可以做得更好,所以独立游戏还会继续做下去。

但是我不该把我的初心忘了,我的初心就是 QFramework,我发现两年的时间没有给 QFramework 新增功能了,我从 QFramework 出发到最后的独立游戏,期间我需要对其负责的人越来越多,qframework 的用户、教程的学生、小班的童鞋、独立游戏的玩家、还有看好我等着我做出成绩的同行们。

我做的事情门类太多,这让我有点迷失。

我骨子里是个 geek,其次是老师,然后是产品经理,最后是独立游戏作者。

而现在我 30 岁出头,把 QFramework 当做 30 岁的起点再合适不过了。不知道再从 QFramework 出发走一轮会走到什么程度,但是这次不会把 QFramework 再丢下了,就算做独立游戏,这次也要用 QFramework 做,就算要出教程,也要用 QFramework 出。

希望第二轮的 QFramework 再更新点屌炸天的功能、再出点屌炸天的课、再培养出屌炸天的人才、然后做出屌炸天的独立游戏。

希望顺利吧。

Original: https://www.cnblogs.com/liangxiegame/p/16866702.htmlAuthor: 凉鞋的笔记Title: 从 QFramework 重新开始

相关阅读 Title: Python实现的数字图象处理之阴影检测与去除

资源下载地址:https://download.csdn.net/download/sheziqiong/85884481资源下载地址:https://download.csdn.net/download/sheziqiong/85884481

数字图象处理之阴影检测与去除 一、介绍

阴影在数字图像中普遍存在,给图像特征提取、图像识别、图像分割等数字图像处理任务带来了不利影响。一种有效的阴影检测和去除方法可以为后续的图像处理带来很大的方便。

[En]

Shadow is ubiquitous in digital images, and it brings adverse effects to many tasks of digital image processing, such as image feature extraction, image recognition and image segmentation. An effective shadow detection and removal method can bring a lot of convenience for the following image processing.

二、阴影检测算法 阴影区域的特征

与同一面上的非阴影区相比,图像中的阴影区一般具有以下特征:其亮度明显低于非阴影区;阴影区与非阴影区之间存在边界,边界宽度一般较小,边界上有渐变;阴影区的颜色通道比例接近非阴影区。我们可以利用这些特征来完成阴影检测工作。

[En]

Compared with the non-shadow areas on the same surface, the shadow areas in the image generally have the following characteristics: their brightness is significantly lower than that of the non-shadow areas; there is a boundary between the shadow areas and the non-shadow areas, the width of the boundary is generally small, and there is a gradual change on the boundary; the color channel proportion of the shadow area is close to that of the non-shadow area. We can use these features to complete the shadow detection work.

基于自然光模型的一个阴影检测算法

在白天的户外环境中,主要存在两种光源:太阳光的直射,和天空的光线散射。非阴影区域同时受到了太阳光的直射和天空的光线散射,而阴影区域则没有太阳光的直射,只存在天空的光线散射。显然,太阳光的直射强度要大大高于天空的光线散射强度。对于阴影区域,它和阳光直射区域的差即为太阳直射的颜色分布。如果能够将太阳直射下颜色在三个通道的构成比例计算出来的话就可以很好的辅助进行阴影检测。田建东等[1]通过计算后得出,阳光直射在RGB三个通道上的强度比例为

从 QFramework 重新开始

使用此功能,可以更准确地识别阴影区域。同时,他们提出,用下面的公式对图像进行变换后,结果将与表面的阴影和非阴影区域非常相似:

[En]

Using this feature, the shadow area can be identified more accurately. At the same time, they propose that after transforming the image with the following formula, the results will be very similar to the shaded and non-shaded areas of the surface:

从 QFramework 重新开始

此时,可以使用一些图像区域分割算法将同一表面的内容切割在一起,从而消除阴影。完整的算法如下:

[En]

At this time, some image region segmentation algorithms can be used to cut the contents of the same surface together, and then the shadow can be removed. The complete algorithm is as follows:

从 QFramework 重新开始 ; 对于上文阴影检测算法的改造

上述阴影检测算法提出了一种非常有用的室外环境光模型。在实践中,该算法并不能很好地工作,并且出现了以下问题:

[En]

The shadow detection algorithm mentioned above proposes a very useful outdoor ambient light model. In practice, this algorithm does not work well, and the following problems arise:

从 QFramework 重新开始

该算法的本质是同时提取属于同一曲面的明暗区域和非明暗区域,不能包含其他区域,否则会对明暗区域和非明暗区域的预测和提取造成很大的干扰。但事实上,在很多情况下,使用这种方法并不能很好地整合同一曲面的面积,往往会出现图片中两个不同的曲面具有相似的值。当两个表面被视为同一区域时,两个表面上的阴影很难被检测到,并且很容易将其中一个表面完全视为阴影。

[En]

The essence of the algorithm is to extract the shaded and non-shaded areas belonging to the same surface at the same time, and can not include other regions, otherwise it will cause great interference to the prediction and extraction of shaded and non-shaded areas. But in fact, in many cases, the use of this method can not well integrate the areas of the same surface, and very often there will be two different surfaces with similar values in the picture. When two surfaces are treated as the same area, the shadows on the two surfaces can hardly be detected, and it is easy to treat one of the surfaces completely as a shadow.

选取阴影可能不满足”阴影较暗”的常识

由于在选择阴影时使用的判断条件不涉及阴影颜色值的绝对大小,而是两个颜色通道之间的差异,因此可能会发生虽然像素的亮度较低,但差异高于高亮度像素的情况。因此,高亮度像素被视为阴影。之后,在接下来的处理中,即使是整个区域中的点也将被视为阴影。

[En]

Because the decision condition used when selecting shadows does not involve the absolute size of the shadow color value, but the difference between the two color channels, it may occur that although the brightness of the pixel is lower, the difference is higher than that of the high-brightness pixel. As a result, high-brightness pixels are treated as shadows. After that, in the following processing, even the points in the whole area will be treated as shadows.

针对上述问题,我们对上述阴影检测算法进行了以下改进,以减少这些问题的影响。变换算法如下:

[En]

Due to the above problems, we have made the following improvements to the above shadow detection algorithm to reduce the impact of these problems. The transformation algorithm is as follows:

和分水岭算法。考虑到图像中需要去除的阴影区域一般较大,并且阴影区域和非阴影区域之间存在明显的亮度差异,采用了简单的正方形块检测方法。对切入原始图像的全1矩阵进行卷积处理,以减少噪声的影响。由于阴影区域和非阴影区域之间的亮度差异很大,因此需要满足该块中最亮和最暗的点之间的差异大于40。同时,这个区域应该有很多接近最亮点和最暗点的点,所以认为归一化后这个区域的标准差应该大于0.25。只有满足上述要求的块才会继续进行下一次检测。

[En]

And watershed algorithm. Considering that the area of the shadow to be removed in the image is generally large, and there is an obvious brightness difference between shaded and non-shaded areas, a simple square block detection method is used. the all-1 matrix cut into the original image is convoluted to reduce the influence of noise. Due to the large brightness difference between shaded and non-shaded areas, it is necessary to satisfy that the difference between the brightest and darkest points in this block is greater than 40. At the same time, there should be many points close to the brightest and darkest points in this region, so it is considered that the standard deviation of this region should be greater than 0.25 after normalization. Only the blocks that meet the above requirements will proceed with the next detection.

2. 类似上文方法,选出非阴影区域,估计表面性质。在选取阴影像素时,需要满足选出来的像素不能已经被作为非阴影区域使用,避免将过亮的点判断为阴影。如果候选阴影通过了上文的检测,那么就将当前块放入总阴影候选中。由于之后会进行延伸,所以省略上文的步骤8。3. 由于阴影较暗,因此取总阴影候选的亮度平均值,并丢弃亮度高于此平均值的候选。剩余在总阴影候选的即认为是阴影,并将从这些阴影开始扩展,查找完整阴影。4. 对于每一个属于阴影的块,以这个块的点开始做FloodFill算法。FloodFill采用以SeedPoint的颜色作为全部的基准的方式,最大差阈值则设为该块在进行上文算法中非阴影区域和阴影区域平均亮度的平均。5. 在FloodFill中,阴影图像可能会存在大量的黑白噪点。因此将图中连通块大小小于1000的连通块颜色反转来消除它们。至此完成阴影区域的检测。

​ 组图1为算法执行流程示例。

算法结果

改进后的阴影检测算法能够准确、完整地检测出大部分阴影。但是,该算法也存在一些问题:面对一些颜色特别复杂丰富的场景,容易出现表面交界处的误识别;在绿地场景中,即当某些通道的颜色强度远高于其他通道时,无法用自然光模型进行验证,也无法检测到阴影等。具体细节将在实验结果和比较部分显示。

[En]

The modified shadow detection algorithm can find out most shadows accurately and completely. However, the algorithm also has some problems: in the face of some scenes with particularly complex and rich colors, it is easy to misidentify the surface junction; in the green space scene, that is, when the color intensity of some channels is much higher than that of other channels, can not be verified by the natural light model and can not detect shadows and so on. The details will be shown in the experimental results and comparison section.

从 QFramework 重新开始

组图1,改造后阴影检测算法的执行步骤。(a)原图。(b)对原图进行切割后两个块的处理样例,左上至右下分别为原图、灰度图、卷积图,左下的方块被接受,右上的方块被拒绝。©步骤1中所有被接受的方块。(d)通过步骤2的检测所得到的阴影候选。(e)筛去平均亮度高于阈值的阴影候选。红色为被筛去的部分。(f)通过阴影候选进行FloodFill算法。(g)去除小连通块噪点。(h)图e,图f与图g的细节对比

; 三、阴影去除算法 阴影去除的难点

找到阴影区域后,需要去除阴影。在执行阴影去除时,需要解决以下困难:

[En]

After finding the shadow area, the shadow needs to be removed. When performing shadow removal, these difficulties need to be addressed:

不同的阴影所在表面有着不同的性质,不能简单的通过调整亮度、对比度的方式完成。 同一个阴影中,由于光源不为完美的点光源,阴影边界会存在轻微模糊,影响去除。 在一些较高较宽物体的阴影中,由于不但太阳直射光被遮挡,天空的光线散射也被部分遮挡,使得同一个阴影的不同位置阴影的深度不相同。 阴影检测算法可能不够完美,一些阴影的边缘未被当作阴影的一部分

我们的阴影去除算法需要考虑到这些困难,并尽可能地去除对结果的影响。

[En]

Our shadow removal algorithm needs to take into account these difficulties and remove the impact on the results as much as possible.

阴影去除算法

基于以上对阴影去除难点的分析,我们采用了以下的阴影去除算法:

[En]

Based on the above analysis of the difficulties of shadow removal, we use the following algorithm for shadow removal:

将一张阴影图像拆成若干张,每张上面为一个连通块的阴影。这样将不同表面的阴影分开处理,避免相互干扰。 对于一张阴影,将阴影扩大5像素。由于阴影检测时可能将阴影边缘并不是很暗的点作为非阴影区域,如果忽略这些点会导致阴影去除结果出现一圈黑边,因此扩大阴影范围以期望能包括进阴影边缘,并在之后进行去除。 由于在步骤2中我们包括了一些亮度相对较高的阴影边缘,以及阴影自身可能存在的亮度不一的问题,我们不能对这块阴影直接作简单的阴影去除。一般来说,距离阴影边缘距离相等的点集,它们与原来相比的亮度降低比例是相近的,所以我们可以简单的将阴影的像素按照其距离阴影边缘的距离分成若干组,每一组分别进行阴影去除。 对于给定需要进行阴影去除的像素点集,我们首先要知道无阴影下应该是什么样子的,即需要得到一个无阴影的像素点集。简单起见,我们选取了与阴影边缘距离大于5像素,又小于10像素的点集作为无阴影像素点集。由于三种颜色通道相对独立,所以我们可以分开处理三种颜色,这样阴影去除就是基于灰度图的阴影去除。 算法结果

在一些图片和阴影中,用单一的颜色就可以达到很好的效果。一些污迹会留在其他图像中,或者阴影区域和非阴影区域的边缘更加陡峭。对于一些图像,阴影不能完全消除,或者阴影和非阴影区域之间存在明显的色差。详细信息将在下一节中介绍。

[En]

In some pictures and shadows with a single color can achieve very good results. Some smear marks will be left in other images, or the edges of shaded and non-shaded areas are more abrupt. For some images, the shadow can not be completely removed, or there is a significant color difference between the shadow and the non-shadow area. The details will be shown in the next section.

四、实验效果与对比 阴影检测

组图2展示了部分阴影检测的结果。

可以看到,在图中表面数量少、阴影面积大的情况下,如前四行,阴影检测算法都能得到比较好的结果,与参考结果十分接近。(a)中手指交叉中间的部分检测时被当做阴影,其主要原因是这块部分的连通块太小,在去除噪点的时候被当做噪点去除了。©的右上角和(d)的右边缘的小块阴影没有被检测出来,可能是因为与其相邻的非阴影区面积较小,或是阴影区域面积太小,使得切成正方形后内部对比度不够大导致。同时,在(a)的手腕处,(b)的阴影左上部分,©的坐下手指部分均有一些不属于阴影的线条或小块被当做阴影。这是因为在进行FloodFill时主要考虑的是点的亮度,这些地方在原图上亮度就较低,因此被当做阴影的一部分。

与(f)是算法检测阴影失败的例子。(e)图像的特点是图像为绿草地,因此图像的R和B分量和G分量相比特别少。因此,在进行自然光模型检验的步骤7时,其颜色差无法达到所设定的颜色差标准,导致所有可能阴影块均被舍弃,无法检测出图像中的阴影。(f)中,检测出的阴影大大超过了参考结果,将车辆的大部分都当做了阴影。导致这个问题的原因是车辆相对图像中其他部分亮度偏低,因此在从阴影开始做FloodFill时,就将亮度偏低的车辆全部当做阴影包括进来,导致结果严重失真。

从 QFramework 重新开始

组图2,第一列为原图,第二列为检测结果,第三列为参考结果

; 阴影去除

组图3展示了运用不同的方法进行阴影去除的结果。

可以看到,当阴影覆盖表面颜色比较简单时,阴影去除算法有着不错的效果。图(a)(b)©(e)(f)几乎还原了图片没有阴影的样子。对于阴影去除使用的方法做了对比,分别是使用了阴影扩张和按距离分组方法;仅使用按距离分组,不进行阴影扩张方法;按距离分组和阴影扩张方法均不采用。在两种方法均不采用的情况下,可以发现在几乎每一张图中,在阴影边缘都存在因为原本亮度不是很低,在变换后颜色过亮的白线。同时,不进行阴影扩张导致了后两种方法在阴影的边缘处基本都有一圈黑边。

但是简单的阴影扩张也存在问题。以图(e)左下方手的阴影为例,不进行阴影扩张的情况下并没有出现大量像素的高亮,但是进行了阴影扩张后手指间的非阴影区域几乎都变得高亮了。出现这个问题的原因主要是进行了阴影扩张后,本来通过5像素扩张进来的手指边缘,因为像素都被填充变成距离边缘几十像素,导致这些像素被严重错估亮度,引起了像素高亮。

同时,也有不少图像的阴影去除不够理想,以图(d)和图(g)为例。图(d)中,虽然边缘比较平滑,但是三种方法处理后依旧显得偏暗,尤其是有半浅色瓷砖被阴影遮挡住的部分。这很明显的体现了当阴影横跨多种表面的时候会导致消除阴影的效果变差。而在图(g)中,颜色偏差则更加严重,除了阴影横跨两个表面以外,还有简单的取阴影边缘所有像素点作为非阴影区域,把两个不同表面的像素点混合到了一起当作特征的原因。

从 QFramework 重新开始

组图3,第一列为原图,第二列为包含阴影扩张和按距离分组,第三列仅按距离分组不进行阴影扩张,第四列按距离分组和阴影扩张都不进行。

资源下载地址:https://download.csdn.net/download/sheziqiong/85884481资源下载地址:https://download.csdn.net/download/sheziqiong/85884481

Original: https://blog.csdn.net/sheziqiong/article/details/125589942Author: biyezuopinTitle: Python实现的数字图象处理之阴影检测与去除

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3