一、获取并修改像素值
将图像看成三维的,x,y和图层(BGR),因此若是[x,y]则输出三个图层的数值,若是[x,y,z]则输出一个数值。
第一种方法:
import cv2 as cv
import numpy as np
img = cv.imread("D://opencv_test//test_a.jpg")
print(img)#直接输出图像的每个像素点
print(img[100, 100])#输出点(100,100)坐标的三个像素值
print(img[:, 100, 1])#输出第100行第二个图层(G)的所有像素值
print(img[:, :, 1])#输出整个图像第二个图层(G)的所有像素值
img[100, 100] = [255, 255, 255]#改变点(100, 100)坐标的三个像素值
print(img[100, 100])
cv.imshow("win", img)
cv.waitKey(0)
cv.destroyAllWindows()
第二种方法:(鸡肋,我觉得)
用到的函数:
1.img.item()
2.img.itemset()
用法见下:
import cv2 as cv
import numpy as np
img = cv.imread("D://opencv_test//test_a.jpg")
print(img.item(100, 100, 1))
#括号内输入具体坐标(三维图像),输出那个点的像素值;等同于print(img[100, 100, 1])
img.itemset((100, 100, 1), 1)
#修改像素值,第一个参数是具体坐标(三维图像),第二个参数是要的修改成的像素值 ;等同于img[100, 100, 1]= 1
print(img.item(100, 100, 1))
print(img.itemset((100, 100, 1), 2))#输出结果是None,错误使用,img.itemset()用来修改
cv.imshow("win", img)
cv.waitKey(0)
cv.destroyAllWindows()
二、获取图像属性
用到的函数:
img.shape
img.size
img.dtype
用法见下:
import cv2 as cv
import numpy as np
img = cv.imread("D://opencv_test//test_a.jpg")
print(img.shape)#如果加载的图像是灰度图,则只返回行和列
print(img.size)
print(img.dtype)
cv.waitKey(0)
cv.destroyAllWindows()
三、图像 ROI
机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。
import cv2 as cv
import numpy as np
img = cv.imread("D://opencv_test//test_a.jpg")
a = img[0:100, 0:100]#勾勒出来的部分
img[200:300, 200:300] = a#将勾勒出来的部分放在图像中你想要放的位置
#注意勾勒出来的部分与放的位置大小要一样
cv.imshow("win", img)
cv.waitKey(0)
cv.destroyAllWindows()
四、拆分及合并图像通道
第一种方法:
用到的函数:
cv.split()
cv.merge()
用法见下:
import cv2 as cv
import numpy as np
img = cv.imread("D://opencv_test//test_a.jpg")
b, g, r = cv.split(img)#函数返回三个图层的元组
cv.imshow("_win_0", b)
cv.imshow("_win_1", g)
cv.imshow("_win_2", r)
Merge = cv.merge((b, g, r))#函数将图层合成
cv.imshow("__win_0", Merge)
cv.waitKey(0)
cv.destroyAllWindows()
第二种方法:(用索引)
import cv2 as cv
import numpy as np
img = cv.imread("D://opencv_test//test_a.jpg")
#拆分三个图层,分别显示
cv.imshow("win_0", img[:, :, 0])
cv.imshow("win_1", img[:, :, 1])
cv.imshow("win_2", img[:, :, 2])
cv.imshow("__win_0", img)
cv.waitKey(0)
cv.destroyAllWindows()
五、为图像扩边(填充)
用到的函数:
cv.copyMakeBorder()
一般是六个参数
- 加载的图像的名字
- 图像上边边界的像素的数量
- 图像下边边界的像素的数量
- 图像左边边界的像素的数量
- 图像右边边界的像素的数量
- 边界的类型(各种类型附在后面)
import cv2 as cv
import numpy as np
img = cv.imread("D://opencv_test//test_a.jpg")
img_1 = cv.copyMakeBorder(img, 15, 15, 15, 15, cv.BORDER_CONSTANT, value=(255, 0, 0))
#特殊例子,后面再加个参数value=(255, 0, 0)表示边界的颜色
img_2 = cv.copyMakeBorder(img, 15, 15, 15, 15, cv.BORDER_REFLECT)
cv.imshow("win_1", img_1)
cv.imshow("win_2", img_2)
cv.waitKey(0)
cv.destroyAllWindows()```
第六个参数:边界类型
1. cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要 下一个参数(value)
2. cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcdefgh|hgfedcb
3. cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT 跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
4. cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh
5. cv2.BORDER_WRAP cdefgh| abcdefgh|abcdefg