数据预处理之图像去空白

简介: 数据预处理之图像去空白

图像去空白


介绍


图像去空白是指在图像处理中去除图像中的空白区域的过程。空白区域通常是指图像中的白色或其他颜色,其不包含有用的信息。去空白的目的是为了节省存储空间、提高图像处理速度、改善图像质量等。


去空白的方法有很多,其中一些常见的方法包括边缘检测、阈值处理、图像剪切和形态学处理。每种方法都有其特定的优势和局限性,因此通常需要结合使用多种方法,以便获得最佳效果。


举个例子,假设有一张图片,其中有一个大的白色区域,我们可以使用阈值处理的方法将其转换为黑白图像,然后使用形态学处理的方法去除其中的白色像素,最终得到一张只包含有用信息的图像。


方法


下面是几种常见的图像去空白方法:


1.边缘检测:通过检测图像中的边缘来去除空白区域。例如,使用 Canny 边缘检测算法或膨胀腐蚀算法。


2.阈值处理:通过设置图像中像素值的阈值来去除空白区域。例如,使用二值化算法。


3.图像剪切:通过计算图像中非空白像素的边界,并仅保留其中的图像。


4.形态学处理:通过使用形态学操作,例如腐蚀和膨胀,来去除空白区域。


这些方法的选择取决于图像的质量、内容和需求。通常,多种方法需要结合使用,以便获得最佳效果。


边缘检测


边缘检测是一种常见的图像去空白方法。该方法通过检测图像中的边缘,从而确定图像的有效区域。


步骤如下:


1.对图像进行预处理,将其转换为灰度图像。


2.使用滤波器对图像进行模糊处理,以减少图像中的噪声。


3.使用边缘检测算法,如Canny算法、Sobel算法等,在图像上检测边缘。


4.对检测到的边缘进行处理,以确定有效区域。


5.将有效区域从图像中剪切出来,得到一张去空白后的图像。


注意:边缘检测方法不一定适用于所有图像,因此需要对不同的图像进行试验,以确定最佳的边缘检测算法和参数。

import cv2
import numpy as np
# 读取图像
img = cv2.imread("input.jpg")
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用Canny边缘检测算法
edges = cv2.Canny(gray, 50, 150)
# 寻找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 确定有效区域
x, y, w, h = cv2.boundingRect(contours[0])
# 将有效区域从图像中剪切出来
cropped = img[y:y + h, x:x + w]
# 保存去空白后的图像
cv2.imwrite("output.jpg", cropped)

阈值处理

import cv2
import numpy as np
# 读取图像
img = cv2.imread("input.jpg")
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 阈值处理
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 确定有效区域
x, y, w, h = cv2.boundingRect(contours[0])
# 将有效区域从图像中剪切出来
cropped = img[y:y + h, x:x + w]
# 保存去空白后的图像
cv2.imwrite("output.jpg", cropped)

形态学图像剪切


目前来说最有用

import numpy as np
import cv2
img = cv2.imread('data/3.jpg')
img = img[:-5,:-5] 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = 255*(gray < 128).astype(np.uint8)
gray = cv2.morphologyEx(gray, cv2.MORPH_OPEN, np.ones((2, 2), dtype=np.uint8))
coords = cv2.findNonZero(gray)
x, y, w, h = cv2.boundingRect(coords)
rect = img[y:y+h, x:x+w] 
cv2.imwrite("Output.jpg", rect)
目录
相关文章
|
JSON 数据格式 Python
对Labelme标注图像,进行90、180、270的旋转,实现标注数据的扩充。
对Labelme标注图像,进行90、180、270的旋转,实现标注数据的扩充。
830 0
对Labelme标注图像,进行90、180、270的旋转,实现标注数据的扩充。
|
6月前
|
存储 传感器 数据可视化
3D目标检测数据集 KITTI(标签格式解析、3D框可视化、点云转图像、BEV鸟瞰图)
本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。
518 0
|
10月前
|
算法 计算机视觉 Python
转:Python的分水岭算法如何分割图像?
分水岭算法是一种图像分割算法。它将图像分割为两个或多个连通区域。算法使用图像的梯度信息来确定图像中的“分水岭”。分水岭是指图像中的边界或轮廓。算法通过找到图像中的分水岭来将图像分割成不同的区域。
92 0
|
机器学习/深度学习 数据可视化 PyTorch
深度学习之如何使用Grad-CAM绘制自己的特征提取图-(Pytorch代码,详细注释)神经网络可视化-绘制自己的热力图
深度学习之如何使用Grad-CAM绘制自己的特征提取图-(Pytorch代码,详细注释)神经网络可视化-绘制自己的热力图
深度学习之如何使用Grad-CAM绘制自己的特征提取图-(Pytorch代码,详细注释)神经网络可视化-绘制自己的热力图
|
机器学习/深度学习 编解码 TensorFlow
图像目标分割_5 DeepLab V2 & V3& V3+
DeepLab采用最新的ResNet图像分类深度卷积神经网络构建,与原来基于VGG-16的网络相比,取得了更好的语义分割性能。
262 0
|
机器学习/深度学习 编解码 算法
图像目标分割_4 DeepLab-V1
相比于传统的视觉算法(SIFT或HOG),Deep-CNN以其end-to-end方式获得了很好的效果。这样的成功部分可以归功于Deep-CNN对图像转换的平移不变性(invariance),这根本是源于重复的池化和下采样组合层。平移不变性增强了对数据分层抽象的能力,但同时可能会阻碍低级(low-level)视觉任务,例如姿态估计、语义分割等,在这些任务中我们倾向于精确的定位而不是抽象的空间关系。
65 0
图像目标分割_4 DeepLab-V1
|
监控 算法 计算机视觉
用分水岭算法实现图像的分割与提取---OpenCV-Python开发指南(36)
用分水岭算法实现图像的分割与提取---OpenCV-Python开发指南(36)
316 0
用分水岭算法实现图像的分割与提取---OpenCV-Python开发指南(36)
|
机器学习/深度学习 资源调度 算法
图像提取特征(下)| 学习笔记
快速学习图像提取特征(下),介绍了图像提取特征(下)系统机制, 以及在实际应用过程中如何使用。
100 0
图像提取特征(下)| 学习笔记
|
机器学习/深度学习 数据采集 自然语言处理
文本特征提取-中|学习笔记
快速学习文本特征提取-中
71 0
文本特征提取-中|学习笔记
|
自然语言处理 算法 数据可视化
文本特征提取 1|学习笔记
快速学习文本特征提取 1
148 0