opencv图像处理技术(阈值处理与图像平滑)_阈值平滑滤波的思想-程序员宅基地

技术标签: 计算机视觉  图像处理  opencv  

进行图像处理时,常常需要对图像进行预处理以提取所需的信息或改善图像质量。阈值处理和图像平滑是两种常见的预处理技术。

阈值处理

阈值处理是一种图像分割技术,其基本思想是将图像中的像素值与一个或多个预先设定的阈值进行比较,根据比较结果将像素分为不同的类别,通常是目标和背景。主要包括二值化、自适应阈值处理等方法。

  • 二值化:将图像像素值转换为两个值之一(通常是0或255),使图像呈现出明显的目标和背景。
  • 自适应阈值处理:根据图像局部特性调整阈值,从而在不同区域获得更好的分割效果。

图像平滑

图像平滑是一种用于去除图像中噪声或细节的技术,其主要目的是使图像变得更加平滑或模糊,以减少噪声对后续处理步骤的影响。常见的图像平滑方法包括均值滤波、高斯滤波、中值滤波等。

  • 均值滤波:将图像中每个像素的值替换为其周围邻域像素值的平均值,用于平滑图像并减少噪声。
  • 高斯滤波:在均值滤波的基础上,考虑了像素之间的权重,使得离中心像素越近的像素具有更高的权重,从而更加自然地模拟图像的模糊效果。
  • 中值滤波:将图像中每个像素的值替换为其周围邻域像素值的中值,对于去除椒盐噪声等斑点噪声效果较好。

任务1 阈值处理基础:

1简单阈值法

简单阈值处理是阈值处理的一种基本形式,它将图像中的像素值与一个固定的阈值进行比较,并根据比较结果将像素值分为两类。以下是简单阈值处理的基本步骤:

  1. 读取图像: 首先,需要读取待处理的图像。

  2. 设定阈值: 简单阈值处理需要设定一个固定的阈值,用来将像素值分为两类,通常为目标和背景。例如,当阈值设定为128时,大于128的像素值被设为一个值(通常为255),小于等于128的像素值被设为另一个值(通常为0)。

  3. 进行阈值处理: 使用设定的阈值对图像进行处理,将像素值分为两类。

  4. 显示处理后的图像: 最后,显示处理后的图像,观察分割效果。

代码:

import cv2
import numpy as np

# 读取彩色图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg", cv2.IMREAD_COLOR)

# 将彩色图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用简单阈值处理
ret, thresh1 = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)

# 显示图像
cv2.imshow('原始图像', img)
cv2.imshow('灰度图像', gray)
cv2.imshow('二值化图像', thresh1)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图: 

2 0tsu阈值处理

Otsu 阈值处理是一种自动确定阈值的方法,它可以根据图像的灰度直方图自动选择最佳阈值,从而进行图像分割。

代码:

import cv2

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg")

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用Otsu阈值处理
ret, otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示原始灰度图像和Otsu二值化图像
cv2.imshow('原始灰度图像', gray)
cv2.imshow('Otsu二值化图像', otsu)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图:

3自适应阈值处理

自适应阈值处理是一种根据图像局部特性动态调整阈值的方法,适用于图像局部光照变化较大或者全局阈值不适用的情况。与简单阈值处理不同,自适应阈值处理不使用固定的阈值,而是根据图像的局部区域计算每个像素的阈值。

代码:

import cv2

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg")

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用均值自适应阈值处理
# cv2.adaptiveThreshold() 函数参数说明:
# gray:输入的灰度图像
# 255:目标像素的最大值
# cv2.ADAPTIVE_THRESH_MEAN_C:使用均值作为阈值计算方式
# cv2.THRESH_BINARY:二值化类型,将大于阈值的像素设置为255,小于阈值的像素设置为0
# 7:块大小,表示在块内计算局部阈值时所使用的像素邻域大小
# 5:从计算的均值或加权均值中减去的常数,用于调整阈值大小
athdMEAN = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 5)

# 使用高斯加权自适应阈值处理
# cv2.adaptiveThreshold() 函数参数说明:
# gray:输入的灰度图像
# 255:目标像素的最大值
# cv2.ADAPTIVE_THRESH_GAUSSIAN_C:使用高斯加权均值作为阈值计算方式
# cv2.THRESH_BINARY:二值化类型,将大于阈值的像素设置为255,小于阈值的像素设置为0
# 5:块大小,表示在块内计算局部阈值时所使用的像素邻域大小
# 3:从计算的均值或加权均值中减去的常数,用于调整阈值大小
athdGAUS = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3)

# 显示均值自适应阈值处理结果和高斯加权自适应阈值处理结果
cv2.imshow('均值自适应阈值处理', athdMEAN)
cv2.imshow('高斯加权自适应阈值处理', athdGAUS)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图:

 任务2:使用滑动条调整阈值

使用滑动条调整阈值是一种交互式调整图像处理参数的方法,对于调试和优化图像处理算法非常有用。在OpenCV中,可以使用cv2.createTrackbar()函数创建滑动条,并为其指定回调函数,以便在滑动条值发生变化时执行相应的操作。

代码:

import cv2
import numpy as np

# 定义一个空函数,用作滑动条回调函数
def nothing(x):
    pass

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg")

# 定义窗口名称
windowName = "dcz_Thresholding"

# 创建一个窗口
cv2.namedWindow(windowName, cv2.WINDOW_AUTOSIZE)

# 创建两个滑动条,一个用于选择阈值类型,另一个用于选择阈值的具体数值
cv2.createTrackbar('Type', windowName, 0, 4, nothing)  # 阈值类型
cv2.createTrackbar('Value', windowName, 0, 255, nothing)  # 阈值数值

while True:
    # 按下ESC键退出循环
    if cv2.waitKey(1) & 0xFF == 27:
        break
    
    # 获取滑动条的当前位置
    Type = cv2.getTrackbarPos('Type', windowName)  # 获取阈值类型
    Value = cv2.getTrackbarPos('Value', windowName)  # 获取阈值数值

    # 根据滑动条的值应用阈值处理
    ret, dst = cv2.threshold(img, Value, 255, Type)

    # 显示处理后的图像
    cv2.imshow(windowName, dst)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

任务巩固:

如果你想要创建RGB颜色表,你可以使用滑动条来调整每个通道的颜色值,以实现动态调整颜色表的效果。

下面是一个简单的示例,演示如何使用滑动条来创建RGB颜色表:

代码:

import cv2
import numpy as np

# 定义一个空函数,用作滑动条回调函数
def nothing(x):
    pass

# 创建一个空白图像作为颜色表
img = np.zeros((512, 512, 3), np.uint8)

# 定义窗口名称
windowName = "RGB Color Map"

# 创建三个滑动条,分别用于调整红色、绿色和蓝色通道的值
cv2.namedWindow(windowName, cv2.WINDOW_AUTOSIZE)
cv2.createTrackbar('R', windowName, 0, 255, nothing)  # 红色通道滑动条
cv2.createTrackbar('G', windowName, 0, 255, nothing)  # 绿色通道滑动条
cv2.createTrackbar('B', windowName, 0, 255, nothing)  # 蓝色通道滑动条

while True:
    # 按下ESC键退出循环
    if cv2.waitKey(1) & 0xFF == 27:
        break
    
    # 获取滑动条的当前位置
    r = cv2.getTrackbarPos('R', windowName)  # 获取红色通道值
    g = cv2.getTrackbarPos('G', windowName)  # 获取绿色通道值
    b = cv2.getTrackbarPos('B', windowName)  # 获取蓝色通道值

    # 更新图像颜色
    img[:] = [b, g, r]  # 赋值BGR颜色

    # 显示颜色图像
    cv2.imshow(windowName, img)

# 关闭窗口
cv2.destroyAllWindows()

结果如图:

 任务3:平滑处理基础

平滑处理是图像处理中常见的一种技术,用于减少图像中的噪声或细节,使图像更加平滑和均匀。常用的平滑处理方法包括均值滤波、中值滤波、高斯滤波等。

  1. 均值滤波:将图像中每个像素的值替换为其周围像素值的平均值。这种方法适用于轻度噪声的去除,但可能会导致图像边缘变得模糊。OpenCv里可以用 cv2.blur(src, ksize,  anchor, borderType)  src:这是输入的图像,可以是灰度图像或者彩色图像。ksize:这是指定的核大小,通常是一个奇数。它指定了在进行均值滤波时考虑的像素邻域大小。例如,如果 ksize 为 3,那么在进行均值滤波时,对于每个像素,它的邻域大小是 3x3。anchor:这是可选参数,表示核的锚点,默认值为 (-1, -1),即表示核的中心点。如果指定了其他值,则表示核的锚点位置。borderType:这是可选参数,表示图像边界的处理方式,默认值为 cv2.BORDER_DEFAULT。可以使用不同的边界处理方式,如 cv2.BORDER_CONSTANTcv2.BORDER_REPLICATE 等。

  2. 中值滤波:将图像中每个像素的值替换为其周围像素值的中值。中值滤波对于椒盐噪声等非线性噪声有较好的去除效果,且不会使图像边缘模糊。OpenCV里可以使用cv2.medianBlur(img,ksize)函数来实现。        

  3. img:这是输入的图像,可以是灰度图像或者彩色图像。

  4. ksize:这是中值滤波核的大小,通常是一个奇数。它指定了在进行中值滤波时考虑的像素邻域大小。例如,如果 ksize 为 3,那么在进行中值滤波时,对于每个像素,它的邻域大小是 3x3。中值滤波器将在这个邻域内计算像素值的中值,并将该中值作为该像素的新值。中值滤波器的工作原理是通过取邻域内像素的中值来去除图像中的噪声,而不会模糊边缘或细节

  5. 高斯滤波:利用高斯函数对图像进行加权平均,降低图像中高频部分的影响,从而实现平滑效果。高斯滤波常用于去除高斯噪声,同时保留图像细节。cv2.GaussianBlur(source,(3,3),0)
    第一个参数为图像对象
    第二个参数为滤波核
    第三个参数0为高斯核标准差

  6. 双边滤波是一种非线性滤波器,它在平滑图像的同时保留了边缘的信息。相比于其他平滑滤波器,双边滤波器考虑了像素之间的空间距离和像素值之间的灰度相似性。这使得它能够在去除噪声的同时保持图像的边缘清晰。在opencv中,用户可以使用cv2.bilateralFilter()函数实现对图像双边滤波处理.cv2.bilateralFilter(img,d,sigmaColor,sigmaSpace)

  7. img表示原图     d 表示滤波要采取的空间距离参数   sigmaColor:这个参数控制了在颜色空间中的标准差,它影响了颜色相似度的权重。较大的sigmaColor值会使得颜色更加容易混淆,因此滤波器会更加宽松地认为颜色相似。通常情况下,当图像中的噪声较强时,可以增大sigmaColor以增强滤波效果,但同时也会模糊边缘。sigmaSpace:这个参数控制了在空间距离上的标准差,它影响了空间相似度的权重。较大的sigmaSpace值意味着更广泛的空间距离内的像素将被考虑在内,即使它们的颜色差异较大,也可能被认为是相似的。增大sigmaSpace可以使得更远的像素对平滑过程产生影响,这样可以更好地保留图像的整体结构。

均值滤波代码

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg")

# 对图像进行均值滤波处理,模糊半径为7x7
blur = cv2.blur(img, (7, 7))

# 显示原始图像
cv2.imshow('原始图像', img)

# 显示经过均值滤波处理后的图像
cv2.imshow('均值滤波处理后的图像', blur)

# 等待按键事件
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

 结果如图:

高斯滤波 代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg")

# 对图像进行高斯滤波处理,卷积核大小为7x7,标准差为10
gaussianBlur = cv2.GaussianBlur(img, (7, 7), 10)

# 显示原始图像
cv2.imshow('原始图像', img)

# 显示经过高斯滤波处理后的图像
cv2.imshow('高斯滤波处理后的图像', gaussianBlur)

# 等待按键事件
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

 结果如图:

 中值滤波代码

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg")

# 对图像进行中值滤波处理,核大小为7x7
median = cv2.medianBlur(img, 7)

# 显示原始图像
cv2.imshow('原始图像', img)

# 显示经过中值滤波处理后的图像
cv2.imshow('中值滤波处理后的图像', median)

# 等待按键事件
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

双边滤波代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dczGaussian.jpg")

# 对图像进行双边滤波处理,核大小为15,空间高斯标准差为300,灰度值相似性标准差为300
bilaterBlur = cv2.bilateralFilter(img, 15, 300, 300)

# 显示原始图像
cv2.imshow('原始图像', img)

# 显示经过双边滤波处理后的图像
cv2.imshow('双边滤波处理后的图像', bilaterBlur)

# 等待按键事件
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

四种滤波结合在一起:

import cv2
import numpy as np

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg")

# 均值滤波
blur = cv2.blur(img, (7, 7))

# 方框滤波
box = cv2.boxFilter(img, -1, (7, 7), normalize=True)

# 高斯滤波
gaussian = cv2.GaussianBlur(img, (7, 7), 10)

# 中值滤波
median = cv2.medianBlur(img, 7)

# 双边滤波
bilater = cv2.bilateralFilter(img, 9, 75, 75)

# 自定义卷积核滤波
kernel = np.array(([-1, -1, 0],
                   [-1, 1, 1],
                   [0, 1, 2]), dtype="float32")
filter2D = cv2.filter2D(img, -1, kernel)

# 显示图像
cv2.imshow('img', img)
cv2.imshow('blur', blur)
cv2.imshow('box', box)
cv2.imshow('gaussian', gaussian)
cv2.imshow('median', median)
cv2.imshow('bilater', bilater)
cv2.imshow('filter2D', filter2D)

# 等待按键事件,关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

上面的结果图太多了就不一一列举了:

上面的代码展示了如何使用OpenCV库对图像进行不同类型的平滑处理。以下是代码的意义和思路:

  1. 导入必要的库:导入了OpenCV库和NumPy库,用于图像处理和数组操作。

  2. 读取图像:使用cv2.imread()函数读取了指定路径下的图像文件。

  3. 应用不同的平滑滤波器:

    • 均值滤波:用cv2.blur()函数对图像进行均值滤波,平滑图像以减少噪声。
    • 方框滤波:使用cv2.boxFilter()函数进行方框滤波,也是一种线性滤波方法。
    • 高斯滤波:调用cv2.GaussianBlur()函数应用高斯滤波,对图像进行平滑处理。
    • 中值滤波:使用cv2.medianBlur()函数对图像进行中值滤波,适用于去除椒盐噪声。
    • 双边滤波:调用cv2.bilateralFilter()函数应用双边滤波,保留边缘的同时平滑图像。
    • 自定义卷积核滤波:使用cv2.filter2D()函数应用自定义卷积核进行滤波处理。
  4. 显示处理后的图像:使用cv2.imshow()函数显示原始图像和经过不同滤波器处理后的图像。

  5. 等待按键事件和关闭窗口:使用cv2.waitKey(0)等待用户按下键盘按键,然后调用cv2.destroyAllWindows()关闭所有窗口。

 任务4使用滑动条进行平滑处理

使用滑动条进行平滑处理是一种常见的图像处理任务场景,通常用于调节滤波器的参数以实现不同程度的平滑效果。这种交互式的方式可以让用户直观地调整参数并实时观察处理后的图像效果,从而更好地理解不同滤波器的作用和影响。

在这个任务场景中,您可以创建一个图形用户界面(GUI),包含一个滑动条(Slider)和一些按钮,用于选择不同的滤波器和控制滤波器的参数。用户可以通过拖动滑动条来调整参数,实时看到图像的平滑效果。这种交互式的方式可以帮助用户更直观地理解不同滤波器的功能和效果。

使用滑动条调整阈值:

代码:

import cv2

# 回调函数,用于阈值处理
def Callback(a):
    # 获取滑动条当前位置
    Type = cv2.getTrackbarPos(tType, windowName)
    Value = cv2.getTrackbarPos(tValue, windowName)
    
    # 根据滑动条的值进行阈值处理
    ret, dat = cv2.threshold(img, Value, 255, Type)

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dczSalt.jpg", 0)

# 定义窗口名称
windowName = "Threshold"
cv2.namedWindow(windowName)

# 在窗口中显示图像
cv2.imshow(windowName, img)

# 定义滑动条名称
tType = "Type"
tValue = "Value"

# 创建滑动条
cv2.createTrackbar(tType, windowName, 0, 4, Callback)
cv2.createTrackbar(tValue, windowName, 0, 255, Callback)

# 等待按键事件
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

 使用滑动条对图像镜像平滑处理

代码:

import cv2

# 回调函数,用于处理滑动条数值的变化
def onValue(a):
    # 获取滑动条当前位置
    Value = cv2.getTrackbarPos(tValue, windowName)
    
    # 根据滑动条的值进行中值滤波处理
    medianBlur = cv2.medianBlur(img, 2 * Value + 1)
    
    # 在窗口中显示中值滤波处理后的图像
    cv2.imshow(windowName, medianBlur)

# 读取图像
img = cv2.imread("C:/Users/win11/opencv/sucai4/dcz.jpg")

# 定义窗口名称
windowName = "medianBlur"
cv2.namedWindow(windowName)

# 在窗口中显示图像
cv2.imshow(windowName, img)

# 定义滑动条名称
tValue = "Value"

# 创建滑动条
cv2.createTrackbar(tValue, windowName, 0, 100, onValue)

# 等待按键事件
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

结果如图:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_74859128/article/details/137471290

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue