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)) # 均值滤波,对于椒盐噪声的滤除效果比较好
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()读取数据的详细过程
img=[H,W,C],故它是从H方向一行一行的读取的{h0,h1,…,h336},对于每一行又是一列一列的读取h0={w0,w1,…,w343},每一列的深度为3,所以w0={R,G,B}。