方法 1:求出每个像素点的 RGB 三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量
方法 2:求 RGB 和 YUV 颜色空间的变化关系,建立亮度 Y 与 RGB 三个颜色分量的对应关系:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。OpenCV 的 cvtColor 函数,可以直接完成灰度化操作。
- # - *-coding: utf - 8 - *-import cv2 import numpy as np
- fn = "test1.jpg"
- if __name__ == '__main__': print('loading %s' % fn) img = cv2.imread(fn) sp = img.shape print(sp)
- #获取图像大小sz1 = sp[0] sz2 = sp[1] print('width:%d\nheight:%d' % (sz2, sz1))#创建一个窗口显示图像cv2.namedWindow('img') cv2.imshow('img', img)#复制图像矩阵,生成与源图像一样的图像,并显示myimg2 = img.copy();
- cv2.namedWindow('myimg2') cv2.imshow('myimg2', myimg2)
- #复制并转换为灰度化图像并显示myimg1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.namedWindow('myimg1') cv2.imshow('myimg1', myimg1) cv2.waitKey() cv2.destroyAllWindows()
实际上 RGB 并不能反映图像的形态特征,只是从光学的原理蚝颜色的调配。把图像转换成 8 位的灰度值图像直接进行处理,可以通过直方图、灰度变化及正交变化之类数学运算对图像做进一步处理,比如说图像识别等。如果有必要,可将图像二值化,这样有利于对图像进一步处理,使图像数据量减小,突显出感兴趣的目标的轮廓。
- # - *-coding: utf - 8 - *-import cv2
- image = cv2.imread('test1.jpg') image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) cv2.threshold(image, 140, 255, 0, image)
- cv2.namedWindow("Image") cv2.imshow("Image", image) cv2.waitKey(0)
图像的二值化,就是将图像上的像素点的灰度值设置为 0 或 255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。
一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值 T,用 T 将图像的数据分成两部分:大于 T 的像素群和小于 T 的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。
Python-OpenCV 中提供了阈值(threshold)函数:
cv2.threshold()
函数:
1. src 指原图像,原图像应该是灰度图。
2. x 指用来对像素值进行分类的阈值。
3. y 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
4. Methods 指不同的阈值方法,这些方法包括:
- ![这里写图片描述](http: //img.blog.csdn.net/20170720082124883?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVuZGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
•cv2.THRESH_BINARY 图(1)
大于阈值的像素点的灰度值设定为最大值 (如 8 位灰度值最大为 255),灰度值小于阈值的像素点的灰度值设定为 0。
•cv2.THRESH_BINARY_INV 图(2)
大于阈值的像素点的灰度值设定为 0,而小于该阈值的设定为 255。
•cv2.THRESH_TRUNC 图(3)
像素点的灰度值小于阈值不改变,大于阈值的灰度值的像素点就设定为该阈值。
•cv2.THRESH_TOZERO 图(4)
像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为 0。
•cv2.THRESH_TOZERO_INV 图(5)
像素点的灰度值大于该阈值的不进行任何改变,像素点的灰度值小于该阈值的,其灰度值全部变为 0。
参考:
http://blog.csdn.net/what_lei/article/details/49159655
- # - *-coding: utf - 8 - *-import cv2 import numpy as np
- img = cv2.imread('test1.jpg')#噪声点数量coutn = 100000
- for k in range(0, coutn) : #获取图像噪声点的随机位置xi = int(np.random.uniform(0, img.shape[1])) xj = int(np.random.uniform(0, img.shape[0]))#加噪
- if img.ndim == 2 : #灰度图像img[xj, xi] = 255 elif img.ndim == 3 : #非灰度图像,图像加噪img[xj, xi, 0] = 25 img[xj, xi, 1] = 20 img[xj, xi, 2] = 20 cv2.namedWindow('img') cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows()
来源: http://blog.csdn.net/xundh/article/details/75453695