机器视觉初步5-2:图像增强专题

这篇具有很好参考价值的文章主要介绍了机器视觉初步5-2:图像增强专题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图像增强是一种提高图像质量和信息量的技术,常用于图像处理、计算机视觉和机器学习中。常见的图像增强方法包括直方图均衡化、高斯滤波、锐化、对比度拉伸、图像平滑、图像锐化、图像滤波、图像金字塔等。


以下是一些常见的图像增强方法的示例代码,使用Halcon和Python实现。

1. 直方图均衡化

图像的灰度直方图就描述了图像中灰度分布情况, 能够很直观的展示出图像中各个灰度级1所占的多少。图像的灰度直方图是灰度级的函数, 描述的是图像中具有该灰度级的像素的个数: 其中, 横坐标是灰度级, 纵坐标是该灰度级出现的率。
直方图的性质:
① 直方图反映了图像中的灰度分布规律。 它描述每个灰度级具有的像素个数, 但不包含这些像素在图像中的位置信息。 图像直方图不关心像素所处的空间位置, 因此不受图像旋转和平移变化的影响, 可以作为图像的特征。

② 任何一幅特定的图像都有唯一的直方图与之对应, 但不同的图像可以有相同的直方图。

③如果一幅图像有两个不相连的区域组成, 并且每个区域的直方图已知, 则整幅图像的直方图是该两个区域的直方图之和。

机器视觉初步5-2:图像增强专题
机器视觉初步5-2:图像增强专题
机器视觉初步5-2:图像增强专题

Halcon代码:

* 使用全局直方图均衡化
gen_histogram_equalizer (HistogramEqualizer, 'image', 0, 255, 70)
* 使用局部直方图均衡化
gen_histogram_equalizer (HistogramEqualizer2, 'image', 0, 255, 70)
* 全局和局部直方图均衡化的区别在于映射函数的不同,全局映射函数将图像所有像素映射到整个像素空间,而局部映射函数将图像的每个子区域映射到像素空间。

Python代码

import cv2
import numpy as np

def histogram_equalizer(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    channels = cv2.split(gray)
    for channel in channels:
        hist = cv2.calcHist([channel], [0, 1], None, [256], [0, 256])
        cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX, -1)
    gray = cv2.merge(channels)
    return cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)

image = cv2.imread('image.jpg')
equalized_image = histogram_equalizer(image)
cv2.imshow('Equalized image', equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像均衡化DEMO

import cv2
import numpy as np

def gray_to_intensity(image):
    h, w, c = image.shape
    intensity = np.zeros((h, w, c))
    for row in range(h):
        for col in range(w):
            intensity[row, col, 0] = image[row, col, 0]
            intensity[row, col, 1] = image[row, col, 1]
            intensity[row, col, 2] = image[row, col, 2]
    return intensity

def reverse_intensity(intensity):
    reversed_intensity = np.zeros((h, w, c))
    for row in range(h):
        for col in range(w):
            reversed_intensity[row, col, 0] = intensity[row, col, 2]
            reversed_intensity[row, col, 1] = intensity[row, col, 1]
            reversed_intensity[row, col, 2] = intensity[row, col, 0]
    return reversed_intensity

def apply_image(image, method):
    h, w, c = image.shape
    reversed_image = method(gray_to_intensity(image))
    reversed_image = reverse_intensity(reversed_image)
    return reversed_image

def image_enhance(image):
    h, w, c = image.shape
    reversed_image = apply_image(image, np.zeros((h, w, c)))
    return reversed_image

if __name__ == '__main__':
    image = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
    image = image_enhance(image)
    cv2.imshow('image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2.锐化

锐化是图像处理中的一个重要概念,用于增强图像中的细节,提高图像的清晰度和对比度。它通过在图像中增加边缘和细节,使得图像看起来更加清晰、细腻。锐化的基本原理是通过增加图像中的高频成分来增加图像的对比度和细节。
在数字图像中,我们可以将图像表示为一个二维矩阵,其中每个像素的颜色值表示图像中该位置的颜色。
矩阵中的值分为三类:低频成分、中频成分和高频成分。低频成分是图像中最常见的颜色,中频成分则是低频成分与高频成分的混合,高频成分是图像中细节和边缘的颜色。
锐化的基本思想是通过增强图像中的高频成分,即增加边缘和细节,使得图像看起来更加清晰和细腻。
具体来说,锐化的方法有很多,例如拉普拉斯算子、Roberts算子、Sobel算子等。这些方法都是通过在图像中增加边缘和细节来实现锐化的目的。
需要注意的是,过度的锐化会导致图像失真和过多的噪声,因此在实际应用中需要根据具体情况选择合适的锐化方法和参数。

2.1 拉普拉斯算子

拉普拉斯算子是一种基于二阶导数的边缘检测方法。在图像中,拉普拉斯算子可以检测具有尖锐边缘的对象,因为它在边缘处产生较大的值。
原理:拉普拉斯算子使用高斯滤波器平滑图像,然后计算图像的二阶导数。二阶导数在边缘处为零,因为图像在边缘处的斜率最大。因此,我们可以通过对二阶导数取绝对值来检测边缘2

在Halcon中,可以使用Laplacian_Sobel()函数进行拉普拉斯算子边缘检测。以下是一个示例:

* 加载图像
read_image (Image, 'input_image.jpg')
* 应用高斯滤波器
filter_image (Image, ImageFiltered, 3, 3)
* 计算拉普拉斯算子
gen_contour_sobel_xld (Laplacian, ImageFiltered, -1, 1, 0, 1)
* 寻找并标记边缘
find_edges (Laplacian, Contours, 'lines', 'true', 'true')
* 显示结果
dev_display (Image)
dev_display (Laplacian)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

用python表示为

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', 0)

# 计算拉普拉斯算子
lap = cv2.Laplacian(image, cv2.CV_64F, ksize=5)

# 显示原始图像和拉普拉斯算子
cv2.imshow('Original Image', image)
cv2.imshow('Laplacian Image', lap)

# 显示所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

2.2 Robert算子

Roberts算子是一种基于一阶导数的边缘检测方法。它在图像中选择垂直和水平方向上的局部最大值,从而找到边缘。
原理:Roberts算子在水平和垂直方向上分别执行梯度计算。梯度的方向角分别是-45度和45度。梯度的大小可以通过计算梯度的模来确定。3

在Halcon中,可以使用Roberts_Sobel()函数进行Roberts算子边缘检测。以下是一个示例:

* 加载图像
read_image (Image, 'input_image.jpg')
* 应用高斯滤波器
filter_image (Image, ImageFiltered, 3, 3)
* 计算Roberts算子
gen_cross_contour_xld (Cross, -1, 1, 2, 1)
gen_contour_sobel_xld (SobelX, ImageFiltered, -1, 1, 0, 1)
gen_contour_sobel_xld (SobelY, ImageFiltered, -1, 1, 0, 1)
gen_contour_sobel_xld (SobelX2, ImageFiltered, -1, 1, 0, 1)
gen_contour_sobel_xld (SobelY2, ImageFiltered, -1, 1, 0, 1)
* 绘制梯度
draw_contour_xld (Cross, -1, 1, 'black', 'true')
draw_contour_xld (SobelX, -1, 1, 'black', 'true')
draw_contour_xld (SobelY, -1, 1, 'black', 'true')
draw_contour_xld (SobelX2, -1, 1, 'black', 'true')
draw_contour_xld (SobelY2, -1, 1, 'black', 'true')
dev_display (Image)
dev_display (Cross)
dev_display (SobelX)
dev_display (SobelY)
dev_display (SobelX2)
dev_display (SobelY2)

python实现

import cv2
import numpy as np

def rotated_sobel_operator(img):
    # 将图像从RGB格式转换为灰度格式
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 将图像进行仿射变换
    # 参数解释:[x,y,z] -- 旋转中心,旋转角度,旋转轴
    # [w,h] -- 旋转后图像的宽度,高度
    # [cx,cy] -- 旋转中心
    # [R,G,B] -- 旋转后图像的颜色

    rotated_img = cv2.getRotationMatrix2D((0, 0), 45, 0.5)
    rotated_img = cv2.warpAffine(gray, rotated_img, (img.shape[1], img.shape[0]))

    # 使用Roberts算子进行边缘检测
    threshold_value = 50
    threshold_count = 3
    thresholded_image = cv2.threshold(rotated_img, threshold_value, 255, cv2.THRESH_BINARY)

    # 将边缘图像转换回灰度图像
    edge_image = cv2.bitwise_not(thresholded_image)

    return edge_image

# 示例用法
img = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
edge_image = rotated_sobel_operator(img)
cv2.imwrite('output.jpg', edge_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

这个代码首先将图像转换为灰度图像,然后对图像进行仿射变换。接下来,它使用Roberts算子进行边缘检测,并将结果保存为新的图像。

2.3 Sobel算子

Sobel算子是一种基于一阶导数的边缘检测方法。它在图像中选择水平和垂直方向上的局部最大值,从而找到边缘。
原理:Sobel算子在水平和垂直方向上分别执行梯度计算。梯度的方向角分别是-45度和45度。梯度的大小可以通过计算梯度的模来确定。
在Halcon中,可以使用Sobel_Sobel()函数进行Sobel算子边缘检测。以下是一个示例:

* 加载图像
read_image (Image, 'input_image.jpg')
* 应用高斯滤波器
filter_image (Image, ImageFiltered, 3, 3)
* 计算Sobel算子
gen_cross_contour_xld (Cross, -1, 1, 2, 1)
gen_contour_sobel_xld (SobelX, ImageFiltered, -1, 1, 0, 1)
gen_contour_sobel_xld (SobelY, ImageFiltered, -1, 1, 0, 1)
gen_contour_sobel_xld (SobelX2, ImageFiltered, -1, 1, 0, 1)
gen_contour_sobel_xld (SobelY2, ImageFiltered, -1, 1, 0, 1)
* 绘制梯度
draw_contour_xld (Cross, -1, 1, 'black', 'true')
draw_contour_xld (SobelX, -1, 1, 'black', 'true')
draw_contour_xld (SobelY, -1, 1, 'black', 'true')
draw_contour_xld (SobelX2, -1, 1, 'black', 'true')
draw_contour_xld (SobelY2, -1, 1, 'black', 'true')
dev_display (Image)
dev_display (Cross)
dev_display (SobelX)
dev_display (SobelY)
dev_display (SobelX2)
dev_display (SobelY2)

Sobel算子是一种用于边缘检测的二维离散微分算子,它将图像中每个像素的灰度值与其相邻的8个像素的灰度值相加,然后将结果乘以一个系数后求和。接下来,将该和与该像素的原始灰度值进行比较,并将其绝对值的大小作为该像素的梯度值。
以下是一个使用Python实现Sobel算子的示例:

import cv2
import numpy as np

def sobel_filter(image, xorder, yorder):
    dst = cv2.Sobel(image, cv2.CV_64F, xorder, yorder, ksize=1, scale=1, delta=0)
    dst = cv2.convertScaleAbs(dst)
    return dst

# 读取图像
image = cv2.imread('image.jpg')

# 设置X和Y方向的阈值
xorder = 5
yorder = 5

# 应用Sobel算子
dst = sobel_filter(image, xorder, yorder)

# 显示原图像和Sobel算子的结果
cv2.imshow('Original Image', image)
cv2.imshow('Sobel Image', dst)

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

在上述代码中,sobel_filter函数接受一个np.ndarray作为输入,ksize=1表示使用快速卷积滤波器,cv2.CV_64F表示使用64位浮点类型,cv2.convertScaleAbs函数将结果转换为绝对值。
请注意,Sobel算子在边缘检测方面非常有效,但也有一些缺点,例如可能会出现伪影和非最大抑制问题。因此,在实践中,通常会结合其他边缘检测方法(如Laplacian算子)来提高检测的准确性。

以上是拉普拉斯算子、Roberts算子和Sobel算子的原理和实例。这些算子在图像处理中具有广泛的应用,可以用于检测边缘、角点3和其他特征。

3.对比度拉伸

对比度拉伸是一种常用的图像处理技术,用于提高图像的视觉效果和可读性。通过对图像中的每个像素值进行处理,调整其亮度和暗度,可以增加图像中的对比度。
在对比度拉伸过程中,通常会将暗部区域的亮度值提高,使其变得更亮,同时将亮部区域的亮度值降低,使其变得更暗。这样可以使图像中的明暗对比更加明显,提高图像的可读性。
对比度拉伸通常用于图像的预处理阶段,以减少图像噪声和提高图像质量。在某些情况下,对比度拉伸也可以用于艺术创作,通过调整图像的对比度来创造出独特的视觉效果。
需要注意的是,对比度拉伸可能会导致图像失真,因此在进行对比度拉伸时需要权衡其效果和图像质量之间的关系。

* 读取图像
read_image (Image, 'yourpics.png')

* 转为灰度图像
rgb1_to_gray (Image, GrayImage)

* 获取图像尺寸
get_image_size (GrayImage, Width, Height)

* 获取图像的宽度和高度
get_image_size (Image, Width, Height)

* 计算宽度、高度的像素值
Width_pixels := Width * 4
Height_pixels := Height * 4

* 对比度拉伸图像
scale_image(Image,ImageScaled, 0.01, 0)

* 显示拉伸后的图像
dev_display (Image)

python代码

import cv2
import numpy as np

def contrast_enhancement(image):
    h, w, _ = image.shape
    chroma_smoothing = np.ones((h, w), np.uint8)
    chroma_smoothing[:, :, 0] = (image[:, :, 1] - image[:, :, 0]) / 255.0 * 0.05
    chroma_smoothing[:, :, 1] = (image[:, :, 0] - image[:, :, 1]) / 255.0 * 0.05
    chroma_smoothing = cv2.bilateralFilter(chroma_smoothing, 15, 75, 75)
    contrast_enhancement = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return cv2.cvtColor(chroma_smoothing, cv2.COLOR_GRAY2BGR)

image = cv2.imread('image.jpg')
enhanced_image = contrast_enhancement(image)
cv2.imshow('Enhanced image', enhanced_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

  1. 灰度级是指图像处理中的一个概念,它表示图像中每个像素的亮度值。在数字图像处理中,灰度级通常被划分为256个级别,从0(黑色)到255(白色)。在这256个级别中,0对应着黑色,255对应着白色,中间的数字对应着不同程度的灰色。灰度级的概念广泛应用于数字图像处理,包括图像压缩、图像增强、图像去噪、图像分割等。在数字图像处理中,灰度级的表示对图像的处理和分析有着重要的意义。 ↩︎

  2. 拉普拉斯算子是一个二阶微分算子,作用在空间上的每一点,用来描述该点的局部曲率。它可以用于图像处理中,比如边缘检测。它的定义为:
    拉普拉斯算子 f(x, y) = (f(x + 1, y) - f(x, y + 1)) / (2 * f’(x, y))
    在OpenCV中,拉普拉斯算子有一个同名函数 cv2.Laplacian(),可以用来计算图像的拉普拉斯算子,该函数的定义如下:
    def cv2.Laplacian(src, ddepth, kernel_size, scale=1, delta=None, returnMat=None, borderType=None)
    其中:
    • src: 输入图像,可以是CV_8U, CV_16U, CV_16S, CV_32F 或 CV_64F 类型。
    • ddepth: 输出图像的深度,必须是CV_16S, CV_32F 或 CV_64F 中的一个,默认值为 CV_32F。
    • kernel_size: 拉普拉斯算子的大小,默认值为3。
    • scale:输出图像的缩放系数,默认值为1。
    • delta: 可选参数,用来增加到输出图像中。
    • returnMat: 可选参数,如果为True,返回一个与输入图像大小和类型相同的二值图像,否则返回一个与输入图像大小相同的矩阵。
    • borderType: 像素边界类型,默认值为 BORDER_CONSTANT,表示使用常数边界。 ↩︎

  3. 角点是图像中的一种特殊像素,通常位于边缘的拐点处,即图像边界上的某个像素点。在图像中,角点是具有明显特征的像素,例如,在图像中的一维向量中,该像素点的坐标可以是极值点。角点可以使我们更容易地识别和分析图像中的形状和边界,因此,在计算机视觉和图像处理中,角点检测是一种非常重要的技术。在图像处理中,角点检测可以用于边缘检测、特征提取、姿态估计、场景重建等多种任务。常见的角点检测算法包括Harris角点检测、SIFT、SURF、FAST等。 ↩︎ ↩︎文章来源地址https://www.toymoban.com/news/detail-493201.html

到了这里,关于机器视觉初步5-2:图像增强专题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 全流程机器视觉工程开发(三)任务前瞻 - 从opencv的安装编译说起,到图像增强和分割

    最近开始做这个裂缝识别的任务了,大大小小的问题我已经摸得差不多了,然后关于识别任务和分割任务我现在也弄的差不多了。 现在开始做正式的业务,也就是我们说的裂缝识别的任务。作为前言,先来说说场景: 现在相机返回过来的照片: 都是jpeg格式的照片,当然也可

    2024年02月19日
    浏览(43)
  • 机器视觉初步12:C#入门初步(有代码示例)

    对于机器视觉中的一些常见方法,我们在前面11篇文章里已经有所了解。 如果想从应用的角度入手,之后就必须对C#/C++的理解与使用更进一步。 在机器视觉中,以C#入手是一个不错的选择,接下来两篇文章,我们简单地过一下C#的基础语法与用法,再开始以WPF入手去理解一些

    2024年02月12日
    浏览(44)
  • 机器视觉初步13:3D相机介绍

    在工业中,3D相机是一种非常重要的传感器,它通过测量目标的物理尺寸和形状来获取关于目标的数据。这种3D相机的工作原理主要基于机器视觉和计算机视觉技术。以下是一些常见的3D相机的工作原理: 这种3D相机使用特定类型的激光光源和摄像机,通常是红外光。激光在物

    2024年02月14日
    浏览(36)
  • 机器视觉初步14:相机标定原理及应用

    相机标定是指通过已知的相机参数,解算相机内部参数矩阵和外部参数矩阵。 在工业中,更多的用户青睐于它在非接触三维尺寸测量上的应用。 所谓的三维测量是广义的三维测量,它不仅包括三维物体的重构与测量,还包括在三维空间中识别任意二维平面上的尺寸以及位置

    2024年02月15日
    浏览(38)
  • 机器视觉初步4:Opencv简介与学习角度

    了解一个新应用的最好方式就是先去官网转转。 Opencv官网 OpenCV(开源的计算机视觉库)是基于BSD协议,因此它可免费用于学术和商业用途。其提供C++,C,Python和Java接口,支持Windows,Linux,Mac OS,iOS和Android。OpenCV致力于高效运算和即时应用开发。因其是用优化的C/C++编写的,故其可以充分

    2024年02月11日
    浏览(44)
  • 【计算机视觉】数字图像处理(四)—— 图像增强

    图像增强是采用一系列技术去改善图像的视觉效果,或将图像转换成一种更适合于人或机器进行分析和处理的形式。例如采用一系列技术有选择地突出某些感兴趣的信息,同时抑制一些不需要的信息,提高图像的使用价值。 图像增强方法 图像增强方法从增强的作用域出发,可

    2023年04月16日
    浏览(108)
  • 【计算机视觉】图像增强----图像的傅立叶变换

    个人简介:  📦个人主页:赵四司机 🏆学习方向:JAVA后端开发  ⏰往期文章:SpringBoot项目整合微信支付 🔔博主推荐网站:牛客网 刷题|面试|找工作神器 📣种一棵树最好的时间是十年前,其次是现在! 💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。 目录 一:

    2024年02月04日
    浏览(39)
  • 13.1 非线性变化的图像增强和补偿——滤波器对图像作增强提高视觉质量(matlab程序)

    1. 简述        图像的线性变换和非线性变换,逐像素运算就是对图像的没一个像素点的亮度值,通过一定的函数关系,转换到新的亮度值。这个转换可以由函数表示: s = f ( r ) s = f( r )s=f(r) 其中r为原来的像素值,s为新的像素值,通常采用的函数了单调函数进行变换。 线性

    2024年02月12日
    浏览(38)
  • imgaug库图像增强指南(32):塑造【雪景】效果的视觉魔法

    在深度学习和计算机视觉的世界里, 数据是模型训练的基石 ,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的关键所在。而 imgaug ,作为 一个功能强大的图

    2024年01月25日
    浏览(42)
  • 图像处理与计算机视觉--第四章-图像滤波与增强-第二部分

    目录 1.图像噪声化处理与卷积平滑 2.图像傅里叶快速变换处理 3.图像腐蚀和膨胀处理 4 图像灰度调整处理 5.图像抖动处理算法    

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包