自学python-opencv(2)图像二值化
import cv2
import numpy as np
def threshold_demo(image):
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
#阈值的阙值
print("threshold value %s"%ret)
cv2.imshow("binary",binary)
def local_threshold(image):
#灰色图像
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#blocksize是奇数 25为像素值,10为阈值
dst=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,10)
cv2.imshow("local_thresgold",dst)
def custom_threshold(image):
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#h,w shape中高 宽
h,w=gray.shape[0:2]
#img=np.array(image)
#降维
m=np.reshape(gray,[1,w*h])
mean=m.sum()/(w*h)
print("mean:",mean)
ret,binary=cv2.threshold(gray,mean,255,cv2.THRESH_BINARY)
cv2.imshow("custom_threshold",binary)
print("-----------hi python-------------")
img=cv2.imread("./images/timg.bmp")
cv2.namedWindow("imput images",cv2.WINDOW_AUTOSIZE)
cv2.imshow("imput images",img)
custom_threshold(img)
#threshold_demo(img)
#local_threshold(img)
cv2.waitKey()
cv2.destroyWindow('all')
-------------------------------------------------------------------------------------------
adaptiveThreshold:它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法
adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,int adaptiveMethod, int thresholdType, int blockSize, double C)
InputArray src:源图像
OutputArray dst:输出图像,与源图像大小一致
int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值。
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值。
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV 具体的请看官方的说明,这里不多做解释。
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,这是局部邻域大小,3、5、7等。
double C:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。
OutputArray dst:输出图像,与源图像大小一致
int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值。
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值。
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV 具体的请看官方的说明,这里不多做解释。
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,这是局部邻域大小,3、5、7等。
double C:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。
----------------------------------------------------------------------------------------------
m=np.reshape(gray,[1,w*h])
reshape是数组对象中的方法,用于改变数组的形状
常用降维:
ravel():将多维数组拉平(一维)。
flatten():将多维数组拉平,并拷贝一份。
squeeze():除去多维数组中,维数为1的维度,如315降维后3*5。
flatten():将多维数组拉平,并拷贝一份。
squeeze():除去多维数组中,维数为1的维度,如315降维后3*5。
reshape(-1):多维数组,拉平。-1是未知
reshape(-1,5):其中-1表示我们不用亲自去指定这一维度的大小,理解为n维。
numpy.reshape(a, newshape, order=’C’)
a:array_like
要重新形成的数组。
newshape:int或tuple的整数
新的形状应该与原始形状兼容。如果是整数,则结果将是该长度的1-D数组。一个形状维度可以是-1。在这种情况下,从数组的长度和其余维度推断该值。
order:{'C','F','A'}可选
使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。'C'意味着使用C样索引顺序读取/写入元素,最后一个轴索引变化最快,回到第一个轴索引变化最慢。'F'意味着使用Fortran样索引顺序读取/写入元素,第一个索引变化最快,最后一个索引变化最慢。注意,'C'和'F'选项不考虑底层数组的内存布局,而只是参考索引的顺序。'A'意味着在Fortran类索引顺序中读/写元素,如果a 是Fortran 在内存中连续的,否则为C样顺序。
a:array_like
要重新形成的数组。
newshape:int或tuple的整数
新的形状应该与原始形状兼容。如果是整数,则结果将是该长度的1-D数组。一个形状维度可以是-1。在这种情况下,从数组的长度和其余维度推断该值。
order:{'C','F','A'}可选
使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。'C'意味着使用C样索引顺序读取/写入元素,最后一个轴索引变化最快,回到第一个轴索引变化最慢。'F'意味着使用Fortran样索引顺序读取/写入元素,第一个索引变化最快,最后一个索引变化最慢。注意,'C'和'F'选项不考虑底层数组的内存布局,而只是参考索引的顺序。'A'意味着在Fortran类索引顺序中读/写元素,如果a 是Fortran 在内存中连续的,否则为C样顺序。
生成gray数组,一行多列。
mean=m.sum()/(w*h)数组
数组求和/高*宽 的权重 类似均值思想
参考博客https://blog.csdn.net/DocStorm/article/details/58593682?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.channel_param
阈值函数讲解参考:
https://blog.csdn.net/weixin_42296411/article/details/80901080?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param
---------------------------

其实你不知道
在你给我糖的时候
有人给了我蛋糕
我没要
我没要蛋糕我不后悔
后悔的是
我以为这颗糖会一直甜
浙公网安备 33010602011771号