opencv-python笔记2-图像表示方法和像素处理

opencv-python笔记2-图像表示方法和像素处理

1. 二值图像
只包含黑色和白色的图像,不难理解。
计算机储存图像是离散的,对于二值图像,使用一个比特位就能表示每个像素点的颜色,即使用1、0就能表示图像。

2. 灰度图像
计算机将灰度处理为256个灰度级,[0,255]这个区间。
255表示纯白,0表示纯黑。
256个灰度级恰好可以用8位二进制一个字节表示。

3. 彩色图像
彩色空间具有不同的表示方式,常用的是RGB色彩空间。
RGB是三个颜色通道,每个颜色的通道的范围都为[0,255]。
256的三次方为16777216,也就是说总共可以产生这么多种颜色。
通常用一个三维数组来表示一幅RGB图像。
一般情况,通道顺序为R-G-B,但是在OpenCV中是B-G-R。

4. 像素处理
1)
在OpenCV中,最小的数据类型是无符号的8位数。
可以使用Numpy生成一个三维数组,一个维度一个通道,表示出一张图片

import numpy as np
import cv2
img = np.zeros((300,300,3),dtype = np.uint8)
img[:,0:120,0] = 220
img[:,100:200,1] = 250
img[:,180:300,2] = 230
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2)
并且可以这样直接访问RGB图片上任意一点的像素值

cus = cv2.imread('C:\\8.png',-1)#-1:保持原格式不变
print(f'查看图上[0,10]的像素值:{cus[0,10]}')

3)
numpy.array提供了item()和itemset()函数来访问和修改像素值。
这两个函数都是经过优化过的,可以大幅度地提高处理效率,比直接索引要快得多。

cus = cv2.imread('C:\\8.png',0)#修改格式为黑白图片
print(f'读取[10,10]点像素值:{cus.item(10,10)}')
cus1 = cv2.imread('C:\\8.png',-1)#原格式
print(f'读取[10,10,0]点的像素值:{cus1.item(10,10,0)}')
cv2.imshow('pic1',cus1)
cv2.waitKey(0)
cv2.destroyWindow('pic1')
for i in range(10,100):
    for j in range(20,200):
        for k in range(0,3):
            cus1.itemset((i,j,k),200)
cv2.imshow('pic2',cus1)
cv2.waitKey(0)
cv2.destroyAllWindows()

不过这样有一个比较遗憾的地方,访问RGB图像不能像直接访问那样,可以只给一个二维坐标,然后给你一个RGB三个参数的结果。使用item(),itemset()函数必须要把通道信息带上,0,1,2必须表明。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首次接触图像处理,通过次来记录自己的学习记录,以方便回忆。 //指针访问像素 void colorReduce(Mat& temImage, int div) { //行数 int rowNumber = temImage.rows; cout << "图像通道数:" << temImage.channels() << endl; //列数*通道数=每一行的元素个数 int colNumber = temImage.cols * temImage.channels(); for (int row = 0; row < rowNumber;row++) { uchar* data = temImage.ptr<uchar>(row); for (int col = 0; col < colNumber;col++) { data[col] = data[col] / div*div + div / 2; } } } //迭代器iterator操作像素 void iterColorReduce(Mat& temImage,int div) { Mat_<Vec3b>::iterator it = temImage.begin<Vec3b>(); Mat_<Vec3b>::iterator itend = temImage.end<Vec3b>(); //存取彩色图像像素 while (it != itend) { //开始处理每个像素 (*it)[0] = (*it)[0] / div*div + div / 2; (*it)[1] = (*it)[1] / div*div + div / 2; (*it)[2] = (*it)[2] / div*div + div / 2; ++it; } } //动态地址计算像素 void atColorReduce(Mat& temImage, int div) { int rowNumber = temImage.rows; int colNumber = temImage.cols; //存取彩色图像 for (int row = 0; row < rowNumber; row++) { for (int col = 0; col < colNumber; col++) { //开始处理每个图像 //蓝色通道 temImage.at<Vec3b>(row, col)[0] = temImage.at<Vec3b>(row, col)[0] / div*div + div / 2; //绿色通道 temImage.at<Vec3b>(row, col)[1] = temImage.at<Vec3b>(row, col)[1] / div*div + div / 2; //红色通道 temImage.at<Vec3b>(row, col)[2] = temImage.at<Vec3b>(row, col)[2] / div*div + div / 2; } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值