opencv基础60-用分水岭算法cv2.distanceTransform()实现图像分割与提取原理及示例

news2025/2/13 11:38:51

在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来。例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆、行人或者其他对象。我们希望将这些对象从视频中提取出来,而忽略那些没有对象进入背景的视频内容。

在前面的章节中,我们讨论了如何使用诸如图像形态学变换、阈值算法、图像金字塔、图像轮廓、边缘检测等方法对图像进行分割。本节介绍使用分水岭算法及 GrabCut 算法对图像进行分割及提取。

算法原理

冈萨雷斯在《数字图像处理》一书中,对分水岭算法进行了细致的分析与介绍。OpenCV的官网建议学习者阅读国立巴黎高等矿业学校图像处理实验室(The Image ProcessingLaboratory of MINES ParisTech)的 CMM(Centre for Mathematical Morphology)网站上关于分水岭算法的介绍和动画演示。

下面对分水岭算法的相关内容做简单的介绍。

任何一幅灰度图像,都可以被看作是地理学上的地形表面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。如图 17-1 所示,其中左图是原始图像,右图是其对应的“地形表面”。

如果我们向每一个山谷中“灌注”不同颜色的水(这里采用了 OpenCV 官网的表述,冈萨 雷斯将灌注表述为在山谷中打洞,然后让水穿过洞以均匀的速率上升)。那么,随着水位不断 地升高,不同山谷的水就会汇集到一起。在这个过程中,为了防止不同山谷的水交汇,我们需 要在水流可能汇合的地方构建堤坝。该过程将图像分成两个不同的集合:集水盆地和分水岭线。我们构建的堤坝就是分水岭线,也即对原始图像的分割。这就是分水岭算法。

在这里插入图片描述
在图 17-2 中,左图是原始图像,右图是使用分水岭算法得到的图像分割结果。在 CMM 的网站上不仅提供了该示例图像,还提供了动画演示效果,有兴趣的读者可以去网站上看看。

在这里插入图片描述
由于噪声等因素的影响,采用上述基础分水岭算法经常会得到过度分割的结果。过度分割会将图像划分为一个个稠密的独立小块,让分割失去了意义。

图 17-3 展示了过度分割的图像。其中左图是电泳现象的图像,右图是过度分割的结果图像,可以看到过度分割现象非常严重。

在这里插入图片描述

为了改善图像分割效果,人们提出了基于掩模的改进的分水岭算法。改进的分水岭算法允许用户将他认为是同一个分割区域的部分标注出来(被标注的部分就称为掩模)。这样,分水岭算法在处理时,就会将标注的部分处理为同一个分割区域。大家可以尝试使用微软PowerPoint
中的“删除背景”功能,加深对此改进算法的理解。

在图 17-4 中,左图是原始图像,我们对其做了标注处理,其中被标注为深色的三个小色块表示:在使用掩模分水岭算法时,这些部分所包含的颜色都会被分割在同一个区域内。使用掩模分水岭算法得到的分割结果如图 17-4 中的右图所示。

在这里插入图片描述

采用改进的分水岭算法对图 17-5 中左侧的电泳图像进行掩模处理,得到右侧的分割结果。可以看出,分割结果得到明显的改进。

在这里插入图片描述

函数 cv2.watershed()介绍

在 OpenCV 中,可以使用函数 cv2.watershed()实现分水岭算法。在具体的实现过程中,还需要借助于形态学函数、距离变换函数 cv2.distanceTransform()、cv2.connectedComponents()来
完成图像分割。下面对分水岭算法中用到的函数进行简单的说明。

1. 形态学函数回顾

在使用分水岭算法对图像进行分割前,需要对图像进行简单的形态学处理。先回顾一下形态学里的基本操作。
(1)开运算
开运算是先腐蚀、后膨胀的操作,开运算能够去除图像内的噪声。例如,在图 17-6 中,先对左图进行腐蚀操作,会得到中间的图像,再对中间的图像进行膨胀操作,会得到右侧的图像。对左图进行开运算(先腐蚀、后膨胀)后,我们得到了右图。

通过观察可知,左图在经过开运算后变成右图以后,上面的毛刺(噪声信息)已经被去除了。

在这里插入图片描述
对图像进行开运算,能够去除图像内的噪声。在用分水岭算法处理图像前,要先使用开运算去除图像内的噪声,以避免噪声对图像分割可能造成的干扰。

(2)获取图像边界
通过形态学操作和减法运算能够获取图像的边界。

例如,在图 17-7 中,左图是原始图像,中间的图是对其进行腐蚀而得到的图像,对二者进行减法运算,就会得到右侧的图像。通过观察可知,右图是左图的边界。

在这里插入图片描述

示例:使用形态学变换,获取一幅图像的边界信息,并观察效果。

原图:

在这里插入图片描述

import cv2
import numpy as np
import matplotlib.pyplot as plt
o=cv2.imread("rice.png",cv2.IMREAD_UNCHANGED)
#构造一个5*5的结构元素
k=np.ones((5,5),np.uint8)
#腐蚀
e=cv2.erode(o,k)
#膨胀
b=cv2.subtract(o,e)

plt.subplot(131)
plt.imshow(o)
plt.axis('off')
plt.subplot(132)
plt.imshow(e)
plt.axis('off')
plt.subplot(133)
plt.imshow(b)
plt.axis('off')
plt.show()

运行结果:

在这里插入图片描述
其中左图是原始图像,中间的图是对其进行腐
蚀而得到的图像,右图是原始图像减去腐蚀图像后得到的边界图像。可以看到,右图比较准确地显示出了左图内前景对象的边界信息。

通过以上分析可知,使用形态学操作和减法运算能够获取图像的边界信息。但是,形态学操作仅适用于比较简单的图像。如果图像内的前景对象存在连接的情况,使用形态学操作就无法准确获取各个子图像的边界了。

2. 距离变换函数distanceTransform

当图像内的各个子图没有连接时,可以直接使用形态学的腐蚀操作确定前景对象,但是如果图像内的子图连接在一起时,就很难确定前景对象了。此时,借助于距离变换函数
cv2.distanceTransform()可以方便地将前景对象提取出来。

距离变换函数 cv2.distanceTransform()计算二值图像内任意点到最近背景点的距离。一般情况下,该函数计算的是图像内非零值像素点到最近的零值像素点的距离,即计算二值图像中所有像素点距离其最近的值为 0 的像素点的距离。当然,如果像素点本身的值为 0,则这个距离也为 0。

距离变换函数 cv2.distanceTransform()的计算结果反映了各个像素与背景(值为0的像素点)
的距离关系。通常情况下:

  • 如果前景对象的中心(质心)距离值为 0 的像素点距离较远,会得到一个较大的值。
  • 如果前景对象的边缘距离值为 0 的像素点较近,会得到一个较小的值。

如果对上述计算结果进行阈值化,就可以得到图像内子图的中心、骨架等信息。距离变换函数 cv2.distanceTransform()可以用于计算对象的中心,还能细化轮廓、获取图像前景等,有多种功能。
距离变换函数 cv2.distanceTransform()的语法格式为:

dst=cv2.distanceTransform(src, distanceType, maskSize[, dstType]])

式中:

  • src 是 8 位单通道的二值图像。
  • distanceType 为距离类型参数,其具体值和含义如表 17-1 所示。

在这里插入图片描述
在这里插入图片描述

  • maskSize 为掩模的尺寸,其可能的值如表 17-2 所示。需要注意,当 distanceType =cv2.DIST_L1 或 cv2.DIST_C 时,maskSize 强制为 3(因为设置为 3 和设置为 5 及更大值没有什么区别)。

在这里插入图片描述

  • dstType 为目标图像的类型,默认值为 CV_32F。
  • dst 表示计算得到的目标图像,可以是 8 位或 32 位浮点数,尺寸和 src 相同。

示例:使用距离变换函数 cv2.distanceTransform(),计算一幅图像的确定前景,并观察效果。

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('water_coins.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow=img.copy()
#对图像阈值化处理,得到二值图像,黑色背景,白色前景,前景为我们要提取的目标,背景为0,前景为1
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#定义一个3*3的卷积核,卷积核的作用是将前景与背景分离
kernel = np.ones((3,3),np.uint8)
#对二值图像进行开运算,去除噪声,开运算是先腐蚀再膨胀的过程,它可以去除小的干扰块,平滑较大的对象边界,同时并不明显改变其面积
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
#距离变换,得到每一个前景像素点到最近的背景像素点的距离,然后对其进行阈值化处理,得到的结果就是前景
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
#对膨胀后的图像进行阈值化处理,得到前景,前景为我们要提取的目标,背景为0,前景为1,这样就得到了我们要提取的目标,但是目标并不连续
ret, fore = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

plt.subplot(131)
plt.imshow(ishow)
plt.axis('off')
plt.subplot(132)
plt.imshow(dist_transform)
plt.axis('off')
plt.subplot(133)
plt.imshow(fore)
plt.axis('off')
plt.show()

结果如下:

在这里插入图片描述

  • 左图是原始图像。
  • 中间的是距离变换函数 cv2.distanceTransform()计算得到的距离图像。
  • 右图是对距离图像进行阈值化处理后的结果图像。

右图比较准确地显示出左图内的“确定前景”。这里的确定前景,通
常是指前景对象的中心。之所以认为这些点是确定前景,是因为它们距离背景点的距离足够远,都是距离大于足够大的固定阈值(0.7*dist_transform.max())的点。

3. 确定未知区域

使用形态学的膨胀操作能够将图像内的前景“膨胀放大”。当图像内的前景被放大后,背景就会被“压缩”,所以此时得到的背景信息一定小于实际背景的,不包含前景的“确定背景”。

以下为了方便说明将确定背景称为 B。距离变换函数cv2.distanceTransform()能够获取图像的“中心”,得到“确定前景”。为了方便说明,将确定前景称为 F。图像中有了确定前景 F 和确定背景 B,剩下区域的就是未知区域 UN 了。
这部分区域正是分水岭算法要进一步明确的区域。
针对一幅图像 O,通过以下关系能够得到未知区域 UN:

未知区域 UN = 图像 O - 确定背景 B - 确定前景 F

对上述表达式进行整理,可以得到:

未知区域 UN =(图像 O - 确定背景 B)- 确定前景 F

上式中的“图像 O - 确定背景 B”,可以通过对图像进行形态学的膨胀操作得到。

示例:标注一幅图像的确定前景、确定背景及未知区域。

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('water_coins.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow=img.copy()
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
#对图像进行膨胀操作,得到背景
bg = cv2.dilate(opening,kernel,iterations=3)

dist = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, fore = cv2.threshold(dist,0.7*dist.max(),255,0)
fore = np.uint8(fore)
un = cv2.subtract(bg,fore)
plt.subplot(221)
plt.imshow(ishow)
plt.axis('off')
plt.subplot(222)
plt.imshow(bg)
plt.axis('off')
plt.subplot(223)
plt.imshow(fore)
plt.axis('off')
plt.subplot(224)
plt.imshow(un)
plt.axis('off')
plt.show()

运行结果:

在这里插入图片描述

  • 左上角是原始图像 ishow。
  • 右上角是对图像 ishow 进行膨胀后得到的图像 bg,其背景图像是确定背景,前景图像是“原始图像-确定背景”。
  • 左下角是确定前景图像 fore。
  • 右下角图像中的小圆环就是未知区域图像 un,是由图像 bg 和图像 fore 相减得到的。也就是说,未知区域图像 un 来源于“原始图像-确定背景-确定前景”。

4. 函数connectedComponents

明确了确定前景后,就可以对确定前景图像进行标注了。在 OpenCV 中,可以使用函数
cv2.connectedComponents()进行标注。该函数会将背景标注为 0,将其他的对象使用从 1 开始的正整数标注。
函数 cv2.connectedComponents()的语法格式为:

retval, labels = cv2.connectedComponents( image )

式中:

  • image 为 8 位单通道的待标注图像。
  • retval 为返回的标注的数量。
  • labels 为标注的结果图像。

示例:使用函数 cv2.connectedComponents()标注一幅图像,并观察标注的效果。

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('water_coins.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow=img.copy()
ret, thresh = cv2.threshold(gray,0,255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
sure_bg = cv2.dilate(opening,kernel,iterations=3)
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, fore = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
fore = np.uint8(fore)
ret, markers = cv2.connectedComponents(fore)
print(markers)
plt.subplot(131)
plt.imshow(ishow)
plt.axis('off')
plt.subplot(132)
plt.imshow(fore)
plt.axis('off')
plt.subplot(133)
plt.imshow(markers)
plt.axis('off')
print(ret)
plt.show()

运行结果:

  • 左图是原始图像 ishow。
  • 中间的是经过距离变换后得到的前景图像的中心点图像 fore。
  • 右图是对前景图像的中心点图像进行标注后的结果图像 markers。
    可以看到,前景图像的中心点被做了不同的标注在这里插入图片描述
    函数 cv2.connectedComponents()在标注图像时,会将背景标注为 0,将其他的对象用从 1
    开始的正整数标注。具体的对应关系为:
  • 数值 0 代表背景区域。
  • 从数值 1 开始的值,代表不同的前景区域。
    在分水岭算法中,标注值 0 代表未知区域。所以,我们要对函数 cv2.connectedComponents()标注的结果进行调整:将标注的结果都加上数值 1。经过上述处理后,在标注结果中:
  • 数值 1 代表背景区域。
  • 从数值 2 开始的值,代表不同的前景区域。

为了能够使用分水岭算法,还需要对原始图像内的未知区域进行标注,将已经计算出来的未知区域标注为 0 即可。
这里的关键代码为:

ret, markers = cv2.connectedComponents(fore)
markers = markers+1
markers[未知区域] = 0

示例:使用函数 cv2.connectedComponents()标注一幅图像,并对其进行修正,使未知区域被标注为 0,并观察标注的效果。

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('water_coins.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow=img.copy()
ret, thresh = cv2.threshold(gray,0,255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
sure_bg = cv2.dilate(opening,kernel,iterations=3)
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, fore = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
fore = np.uint8(fore)
ret, markers1 = cv2.connectedComponents(fore)
foreAdv=fore.copy()
unknown = cv2.subtract(sure_bg,foreAdv)
ret, markers2 = cv2.connectedComponents(foreAdv)
markers2 = markers2+1
markers2[unknown==255] = 0
plt.subplot(121)
plt.imshow(markers1)
plt.axis('off')
plt.subplot(122)
plt.imshow(markers2)
plt.axis('off')
plt.show()

运行结果:

在这里插入图片描述

对比左右图可以看出,右图在前景图像的边缘(未知区域)进行了标注,使得每一个确定前景都有一个黑色的边缘,这个边缘是被标注的未知区域。

分水岭算法 函数cv2.watershed()

完成上述处理后,就可以使用分水岭算法对预处理结果图像进行分割了。在 OpenCV 中,实现分水岭算法的函数是 cv2.watershed(),其语法格式为:

markers = cv2.watershed( image, markers )

式中:

  • image 是输入图像,必须是 8 位三通道的图像。在对图像使用 cv2.watershed()函数处理之前,必须先用正数大致勾画出图像中的期望分割区域。每一个分割的区域会被标注为1、2、3 等。对于尚未确定的区域,需要将它们标注为 0。我们可以将标注区域理解为进行分水岭算法分割的“种子”区域。
  • markers 是 32 位单通道的标注结果,它应该和 image 具有相等大小。在 markers 中,每一个像素要么被设置为初期的“种子值”,要么被设置为“-1”表示边界。markers 可以省略。

使用分水岭算法进行图像分割时,基本的步骤为:

  1. 通过形态学开运算对原始图像 O 去噪。
  2. 通过腐蚀操作获取“确定背景 B”。需要注意,这里得到“原始图像-确定背景”即可。
  3. 利用距离变换函数 cv2.distanceTransform()对原始图像进行运算,并对其进行阈值处理,
    得到“确定前景 F”。
  4. 计算未知区域 UN(UN = O –B - F)。
  5. 利用函数 cv2.connectedComponents()对原始图像 O 进行标注。
  6. 对函数 cv2.connectedComponents()的标注结果进行修正。
  7. 使用分水岭函数完成对图像的分割。

代码示例:使用分水岭算法对一幅图像进行分割,并观察分割的效果。

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('water_coins.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow=img.copy()
ret, thresh = cv2.threshold(gray,0,255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
sure_bg = cv2.dilate(opening,kernel,iterations=3)
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers+1
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]
plt.subplot(121)
plt.imshow(ishow)
plt.axis('off')
plt.subplot(122)
plt.imshow(img)
plt.axis('off')
plt.show()

运行效果:

在这里插入图片描述

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

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

相关文章

CSP复习每日一题(四)

树的重心 给定一颗树,树中包含 n n n 个结点(编号 1 ∼ n 1∼n 1∼n)和 n − 1 n−1 n−1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义: 重心是指树中的一…

C++初阶语法——类和对象

前言:C语言中的结构体,在C有着更高位替代者——类。而类的实例化叫做对象。 本篇文章不定期更新扩展后续内容。 目录 一.面向过程和面向对象初步认识二.类1.C中的结构体2.类的定义类的两种定义方式 3.类的访问限定符及封装访问限定符说明 4.类的实例化对…

吴声连续3年讲三翼鸟,用户3年见证场景风起时

听到《风再起时》,你会想到什么? 或许是同名电影、张国荣的同名歌曲,亦或者是某部电视剧,在各自领地中发光发热。 就在8月6日,我们注意到,被业界誉为「了解中国商业发展趋势必听盛会」的《新物种爆炸吴声…

AST入门与实战(二):删除垃圾代码

原文地址:https://zhuoyue360.com/jsnx/109.html AST入门与实战(一):基于babel库的js反混淆模板的实践 : https://www.zhuoyue360.com/jsnx/106.html 还记的上一篇AST的文章,我们把函数调用简单的给替换了一下,但是其最终的效果并不完美. 哪里不完美呢? 有如下几点: 开头的匿…

C语言 指针变量的大小与指针类型

一、指针变量的大小 例如:int main() {int num 10;int* p #char ch w;char* pc &ch;printf("%d\n",sizeof(p));printf("%d\n",sizeof(pc));return 0; }答案分别是 4 和 4 指针变量中存储的是地址,而非前缀类型下的元素&…

Sui网络的稳定性和高性能

Sui的最初的协议开发者设计了可扩展的网络,通过水平扩展的方式来保持可负担得起的gas费用。其他区块链与之相比,则使用稀缺性和交易成本来控制网络活动。 Sui主网上线前90天的数据指标证明了这一设计概念,在保持100%正常运行的同…

CSS3中的var()函数

目录 定义: 语法: 用法: 定义: var()函数是一个 CSS 函数用于插入自定义属性(有时也被称为“CSS 变量”)的值 语法: var(custom-property-name, value) 函数的第一个参数是要替换的自定义属性…

【网络编程·传输层】UDP和TCP的经典八股文

目录 一、端口号划分 二、部分指令 1、pidof(用于查看进程id) 2、netstat(查看网络状态) 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …

关于接口自动化,你不能不知道的高级技巧——接口自动化神器apin进阶操作

一、变量提取和引用 变量提取和引用主要是为了解决接口之间的参数依赖问题。 使用场景:接口 A 的参数中需要使用接口 B 返回的某个数据,那么就要在请求 B 接口之后,提取数据保存,给请求 A 接口时使用。 1、变量提取 在用例集或…

AST入门与实战(三):if节点转switch节点(瑞数5)

原文地址:https://zhuoyue360.com/jsnx/110.html 1. 期望 这是一个瑞数5代解混淆的案例&#xff0c;我们本章节需要做的是把if节点的内容转换成switch-case内容.以此来熟悉AST对JS混淆的对抗. 原始代码: function whileState() {while (1) {aV cA[wU];if (aV < 4) {if (…

metaRTC7 demo mac/ios编译指南

概要 metaRTC7.0开始全面支持mac/ios操作系统&#xff0c;新版本7.0.023 mac os demo 包含有srs/zlm的推拉流演示。发布版自带了x64版第三方类库&#xff0c;arm版第三方类库还需开发者自己编译。 源码下载 下载文件metartc7.023.7z https://github.com/metartc/metaRTC/re…

远程桌面弱口令攻击:网络安全的顽疾与挑战

导语&#xff1a; 随着远程办公和云技术的普及&#xff0c;远程桌面弱口令攻击成为了网络安全的顽疾。本文将深入探讨弱口令攻击的原理、危害以及有效的防范措施&#xff0c;帮助读者提升远程桌面安全性。 第一部分&#xff1a;弱口令攻击的原理与方法 1.1 什么是远程桌面弱口…

页面的滚动及scrollIntoView的穿透效果和解决

朋友今天遇到一个奇怪的问题&#xff0c;我觉得很有意思就记录一下。现象是这样的&#xff0c;页面有一个按钮&#xff0c;点击按钮以后会请求一个接口拿到一个iframe的地址然后创建一个iframe并渲染到页面上&#xff0c;iframe的页面加载完毕后会滑动到对应的某一个元素的位置…

统一门户|WorkPlus整合内部应用,构筑企业统一的智能工作入口

国家“十四五”发展规划中指出加强数字化发展&#xff0c;支持企业建设一体化数字平台&#xff0c;全面整合企业内部系统&#xff0c;提升产业链上下游协同效率。而在数字化经济浪潮下&#xff0c;企业和各类组织随着业务规模、人员规模的不断扩大&#xff0c;在信息化办公中存…

一次暴露面全开的红帽渗透测试【getshell】

0x01、信息收集阶段 注&#xff1a;本次信息收集过程主要使用FOFA网络探测平台 https://fofa.info/ 一开始进行收集的时候&#xff0c;有点迷&#xff0c;直接进行了大面积的"gov.in"域名收集 host"gov.in" && country"IN" 哈哈68465…

buuctf crypto刷题1

目录 (1) 凯撒&#xff1f;替换&#xff1f;呵呵!(替换密码爆破) (2) RSA1(dp泄露) (3) RSA2(dp泄露大整数分解) (4) RSA3(共模攻击) (5) 还原大师(md5爆破) (6) RSA(公钥文件解析) (7) RsaRoll (8) Dangerous RSA(小明文攻击) (9) [GUET-CTF2019]BabyRSA (10) [BJD…

成集云 | 聚水潭售后申请单同步伙伴云 | 解决方案

方案介绍 聚水潭是一款电商平台&#xff0c;提供售后申请功能帮助用户解决购物过程中遇到的问题&#xff0c;售后申请功能为用户提供了便利的售后服务&#xff0c;并促进用户与商家或卖家之间的沟通和协商。用户可以在聚水潭平台上轻松提交售后申请&#xff0c;并随时查看处理…

『赠书活动 | 第十七期』《Python网络爬虫:从入门到实战》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十七期』 本期书籍&#xff1a;《Python网络爬虫&#xff1a;从入门到实战》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff5c;收…

国内唯一!腾讯零信任iOA入选全球UEM厂商全景图

近日&#xff0c;国际权威机构Forrester发布《The Unified Endpoint Management Landscape, Q3 2023》&#xff08;以下简称“报告”&#xff09;&#xff0c;对全球24家统一终端管理厂商进行了综合性评估&#xff0c;腾讯安全凭借零信任iOA在DEX&#xff08;数字化员工体验&am…

烂尾30年的楼盘,变身高端豪宅,龙华又多一供应

近日&#xff0c;深圳市规划和自然资源局龙华管理局发布了恒地尊悦花园&#xff08;A807-0632&#xff09;建设工程规划许可证的通告。恒地尊悦花园位于龙华区民治街道民荣北路与民通路交果东侧&#xff0c;项目地块实际上就是烂尾了近30年的福罗拉山庄别墅区。 根据规划&#…