【计算机视觉】图片裁减黑边或者白边

基础

opencv读取图片 https://blog.csdn.net/weixin_33832340/article/details/92119616

读图片

image_arr = cv2.imread('file_path')

灰度图扩展成彩色图

可以通过图片的channel判断是否是灰度图。如果需要可以将灰度图扩展到RGB的彩色图(复制灰度图的数据到各通道)

if image_arr.shape[2] == 1:
  image_arr_rgb = cv2.cvtColor(image_arr, cv2.COLOR_GRAY2RGB)

 彩色图像素存储格式

imread 读的彩色图按照BGR像素存储,如果转换成RGB则需要用cvtColor函数进行转换

image_arr_rgb = cv2.cvtColor(image_arr, cv2.COLOR_BGR2RGB)

 图片size存储格式(imread 读的图片按照 H,W,C 格式存储)

image_arr_rgb.shape
(H, W, C)

H,W,C格式转换到C,H,W格式

image_arr_rgb_chw = np.transpose(image_arr_rgb, (2,0,1))

涉及到的图像处理 

# 图像腐蚀 # iteration的值越高,模糊程度(腐蚀程度)就越高 呈正相关关系
# 使用场景:
图像腐蚀 加上高斯模糊 就可以使得图像的色彩更加突出
可以是色彩追踪更加精准,少了很多的颜色干扰

closed_1 = cv2.erode(gray, None, iterations=4)

机器学习进阶-图像形态学操作-膨胀操作 1.cv2.dilate(进行膨胀操作)

图像的腐蚀与膨胀

cv2.dilate(src, kernel, iteration)

参数说明: src表示输入的图片, kernel表示方框的大小, iteration表示迭代的次数

膨胀操作原理:存在一个kernel,在图像上进行从左到右,从上到下的平移,如果方框中存在白色,那么这个方框内所有的颜色都是白色。

目的:腐蚀之后,再膨胀,会让原有的图像信息更明显。

cv2.blur图像滤波(Filter)处理学习笔记 

均值滤波,为了去噪。

图像降噪。我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。

blurred = cv2.blur(closed_1, (9, 9)) # 均值滤波,对于椒盐噪声的滤除效果比较好

【计算机视觉】图片裁减黑边或者白边_第1张图片

opencv: 阈值处理(cv2.threshold) 探究(图示+源码)

cv2.threshold (src, thresh, maxval, type) 固定阈值二值化

cv2.threshold (源图片, 阈值, 填充色, 阈值类型),255是白色 

ret, dst = cv2.threshold(src, thresh, maxval,type)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图
  • dst: 输出图
  • thresh: 阈值
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

图像二值化的目的:对图象进行二值化处理的意义? - 知乎

为了将前景、背景分离。

灰度图像二值化最常用的方法是阈值法,他利用图像中目标与背景的差异,把图像分别设置为两个不同的级别,选取一个合适的阈值,以确定某像素是目标还是背景,从而获得二值化的图像。

_, thresh = cv2.threshold(blurred, num, 255, cv2.THRESH_BINARY) # thresh 这里是输出图

otsu阈值

最大疑问!轮廓检测和边缘检测的区别是什么?https://stackoverflow.com/questions/17103735/difference-between-edge-detection-and-image-contours

轮廓检测 

OpenCV(六)之图像轮廓检测  (轮廓检测看这篇就够了)

Python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题

cv2.findContours() 用来找出轮廓值

# 返回轮廓contours
cnts, _ = cv2.findContours(closed_2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]

返回[ ]

尝试修改OpenCV轮廓会导致错误

保存输出时,如果轮廓小于100,则可能返回NULL。
下一个对空值的操作会产生这个错误尝试通过将contour = StraightenContour(contour)放在print(len(contour))函数的开头进行调试,很可能轮廓小于100,从而使函数返回空值。
如果不将StraightenContour(contour)的输出保存在可变轮廓中,则len(轮廓)<100在返回时不会在任何地方保存空值,其余代码将正常运行。
解决方法是当它的长度小于100时简单地StraightenContour(contour)也许你会考虑通过运行一些实验来找到最佳值,将100改为其他值。

【python-opencv】cv2.findContours()寻找轮廓时报错小汇总

OpenCV轮廓提取算法详解findContours()

cv2.findContours()函数

 

第五节、轮廓检测、直线和圆、多边形检测(好好好)

 


根据 Python OpenCV轮廓排序(按照面积大小) 理解一下,

 

Python-Opencv minAreaRect生成最小外接矩形的一些解释

cv2.boxPoints()详解

 


相关解决办法:

使用python去除图片周围的白色边框(黑色边框)

建议采用自适应阈值分割算法来求取阈值,可采用OTSU,最大熵等相对简单的算法。

[python + opencv] 视频帧图像去黑边 - foolishwolf的文章 - 知乎

利用python和opencv批量去掉图片黑边(我采用的)

image.set_colorkey((0,0,0))

 

 

 

 

cv2.imread()读取数据的详细过程

 【计算机视觉】图片裁减黑边或者白边_第2张图片【计算机视觉】图片裁减黑边或者白边_第3张图片

img=[H,W,C],故它是从H方向一行一行的读取的{h0,h1,…,h336},对于每一行又是一列一列的读取h0={w0,w1,…,w343},每一列的深度为3,所以w0={R,G,B}。

 

你可能感兴趣的:(计算机视觉)