点击上方“AI搞事情”关注我们


一、像素操作

可以通过行列坐标访问像素值,对于BGR图,返回一个蓝色、绿色、红色通道的数组值,对于灰度图,仅返回相应的强度值。

代码

import cv2
img = cv2.imread('image.jpg')
px = img[32,32] # 访问(32,32)坐标像素值
print(px)
print(img[32,32,0]) # 访问B通道像素值
print(img[32,32,1]) # 访问G通道像素值
img[32,32] = [108, 108, 108] # 修改像素值
print(img[32,32])

输出

[ 93 136 145]
93
136
[108 108 108]

Note

  • Numpy是一个用于快速阵列计算的优化库。因此,简单地访问每个像素值并对其进行修改将非常缓慢。

  • 上述方法通常用于选择数组的一个区域,比如前五行和三列,对于访问单个像素点,推荐使用array.item()array.itemset(),它们返回的是一个标量。如果需要访问所有B,G,R值,需要对它们单独调用array.item()

代码

import cv2
img = cv2.imread('image.jpg')
p = img.item(32,32,2) # 访问R值
print(p)
img.itemset((32,32,2),100) # 修改R值
p = img.item(32,32,2)
print(p)

输出

145
100

二、图像属性

图像属性包括:行、列、通道数,数据类型,像素数目。

import cv2
img = cv2.imread('image.jpg')print(img.shape)  #图像的形状,返回值是一个包含行数(高)、列数(宽)、通道数的元组。
print(img.size)   #图像的像素数目。
print(img.dtype)  #图像的数据类型。

输出

(640, 1024, 3)
1966080
uint8

Note

  • 注意如果图像是灰度图像,img.shape返回的元组仅包含行数和列数,因此它是一种检查图像是灰度图像还是彩色图像的好方法。

  • img.dtype在调试时非常重要,因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的。

三、图像ROI

ROI (region of interest, 感兴趣区域)是从图像中选择的一个图像区域,这个区域是你的图像分析所关注的重点。圈定该区域以便进行进一步处理。使用ROI圈定你想处理的目标,可以减少处理时间,增加精度。比如:对于图像中的眼睛检测,在整个图像上进行第一次面部检测。当获得面部时,我们单独选择面部区域并在其内部搜索眼睛而不是搜索整个图像。

选择图像ROI并将其复制到图像中的另一个区域

代码

import cv2
img = cv2.imread('image.jpg')husky = img[1:240,60:270]
img[61:300,270:480] = huskycv2.imshow('show',img)
cv2.waitKey()

四、通道拆分

B,G,R三通道含有不同的颜色信息,有时需要将通道分离,在单个通道进行操作。有两种通道分离的方式:

  • cv2.split函数

import cv2
img = cv2.imread('img.jpg')
b,g,r = cv2.split(img) #拆分图像通道
img = cv2.merge((b,g,r))
  • numpy切片

b = img[:,:,0]

单通道所有像素置零

img[:,:,2] = 0

NOTE:
cv2.split()相对比较耗时,必要时才使用。否则建议使用Numpy索引。

五、图像边框

copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)

src:输入图像
topbottomleftright:相应方向上像素数的边框宽度
value :
cv2.BORDER_CONSTANT
cv2.BORDER_REFLECT
cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT
cv2.BORDER_REPLICATE
cv2.BORDER_WRAP

不同value效果代码

import cv2
from matplotlib import pyplot as pltBLUE = [255,0,0]img1 = cv2.imread('image.jpg')replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')plt.show()

六、应用

1. 获取图像ROI并拼接在原图下方

代码

import cv2
import numpy as npimg1 = cv2.imread('image.jpg')
img2 = img1[200: 500, 300:650, :]w = max(img1.shape[1], img2.shape[1])
h = img1.shape[0] + img2.shape[0]merge_img = np.zeros((h, w, 3), dtype=np.uint8)
merge_img[:img1.shape[0], :img1.shape[1]] = img1
merge_img[img1.shape[0]:, :img2.shape[1]] = img2
cv2.imwrite('res.jpg', merge_img)
cv2.imshow('img', merge_img)
cv2.imshow('img2', img1)
cv2.waitKey(0)

2. 利用通道分离去除票据红色印章

代码

import cv2th = 180  # 二值化阈值
src = cv2.imread('image.jpg')
blue, green, red = cv2.split(src)
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, th, 255, cv2.THRESH_BINARY)_, red_binary = cv2.threshold(red, th, 255, cv2.THRESH_BINARY)
cv2.imshow("src", src)
cv2.imshow("gray", gray)
cv2.imshow("binary", binary)
cv2.imshow("red channel", red)
cv2.imshow("blue channel", blue)
cv2.imshow("green channel", green)
cv2.imshow("red+binary", red_binary)new_img = cv2.merge((blue, green, red_binary))
cv2.imshow("new image", new_img)
cv2.waitKey(0)

原图

灰度图

红色通道图

红色通道二值化结果


参考:如何去除票据上的印章: https://www.cnblogs.com/skyfsm/p/7638301.html

往期推荐

  • 【opencv系列01】OpenCV4.X介绍与安装

  • 【opencv系列02】OpenCV4.X图像读取与显示

  • 【opencv系列03】OpenCV4.X视频捕获与显示

  • 【opencv系列04】OpenCV4.X图形绘制

  • 【opencv系列05】OpenCV4.X鼠标回调函数

  • 【opencv系列06】OpenCV4.X滑动条操作

长按二维码关注我们

有趣的灵魂在等你

【opencv系列07】OpenCV4.X图像基本操作相关推荐

  1. 【opencv系列08】OpenCV4.X图像融合操作

    点击上方"AI搞事情"关注我们 图像叠加 add(src1, src2, dst=None, mask=None, dtype=None)函数或者numpy操作实现图像按位相加,若 ...

  2. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  3. OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换

    OpenCV与图像处理学习五--图像滤波与增强:线性.非线性滤波.直方图均衡化与Gamma变换 三.图像滤波与增强 3.1 线性滤波 3.1.1 方框滤波 3.1.2 均值滤波 3.1.3 高斯滤波 ...

  4. opencv系列-图像清晰度评价

    opencv系列-图像清晰度评价 1,换了opencv3.4,用来测试 2,opencv好评呀 图像清晰度评价算法有很多种,在空域中,主要思路是考察图像的领域对比度,即相邻像素间的灰度特征的梯度差:在 ...

  5. Opencv图像基本操作

    唐宇迪博士opencv课程学习笔记 Opencv图像基本操作 数据读取-图像 数据读取-视频 截取部分图像数据 颜色通道提取 边界填充 数值计算 图像融合 图像重构 数据读取-图像 cv2.IMREA ...

  6. Opencv4学习-3、进阶图像基本操作1

    1.一维图像直方图 从0-255之间每个像素的取值都只能是其中一个,那么0-255的值出现再图像各个像素的频率也就会不一样. Bins其实就是统计的单元:如果是一单元那么0-255(256)个频率值, ...

  7. 02- OpenCV绘制图形及图像算术变换 (OpenCV系列) (机器视觉)

    知识重点 OpenCV用的最多的色彩空间是HSV. 方便OpenCV做图像处理 img2 = img.view()     # 浅拷贝 img3 = img.copy()    # 深拷贝 split ...

  8. OpenCV基础(基于Opencv4.4+VS2019)

    OpenCV基础(基于Opencv4.4+VS2019) 1.OpenCV介绍 OpenCV是计算机视觉开源库,主要算法涉及图像处理和机器学习相关方法. 是Intel公司贡献出来的,俄罗斯工程师贡献大 ...

  9. 用OpenCV4实现图像的超分别率

    用OpenCV4实现图像的超分别率 本实验原文链接: https://arxiv.org/pdf/1807.06779.pdf 原文摘要 单图像超分辨率(SISR)的主要挑战是如何恢复微小纹理等高频细 ...

最新文章

  1. go 调用dll char*传输
  2. Mysql Federated Server 示例
  3. “挤掉”优衣库的Ubras、蕉内、内外等新内衣品牌们,到底牛在哪?
  4. (ab)使用Java 8 FunctionalInterfaces作为本地方法
  5. 【机器学习】 - CNN
  6. python三维模型_python三维模型
  7. dubbo 自定义过滤器
  8. 安全基础知识 细说暴库的原理与方法
  9. 部署模型之Libtorch学习(一)
  10. 大华摄像头解码 ffmpeg_解码矩阵配套液晶拼接屏系统解决安防行业设备过于复杂的问题...
  11. Androidstudio 里面的app下目录介绍
  12. 整理一些即使通讯的测试点
  13. 后端码农谈前端(CSS篇)第二课:CSS的5个来源
  14. Java输出英语字母对应的数字
  15. ERROR: Could not build wheels for numpy which use PEP 517 and cannot be installed directly
  16. SaaS应用价值存巨大争议
  17. halcon算子翻译——dev_update_off、dev_update_on
  18. MariaDB GRANT ALL PRIVILEGES Access denied for user
  19. 下列有关计算机语言的叙述中,下列关于计算机语言的叙述中,正确的是( )...
  20. ESXI 6.0正式版官网下载地址

热门文章

  1. GetClientRect()和GetWindowRect()
  2. SQLite学习手册(表达式)
  3. 数据结构与算法(C++)-- 算法分析
  4. linux-grub修复5步搞定
  5. Redox随笔(2)-用Rust语言编写的类UNIX操作系统
  6. mxnet基础到提高(10)--读写文件
  7. 【机器学习】NeuralProphet,这个时序工具包也太强了吧...
  8. 【NLP】文本预处理:删除单词停用词
  9. 【NLP】一文搞懂NLP中的对抗训练
  10. 【Python基础】Python爬虫的两套解析方法和四种信息提取方式