一、彩色图像像素处理

代码

import cv2
import numpy as np
#----------蓝色通道----------
blue=np.zeros((300,300,3),dtype=np.uint8)
blue[:,:,0]=255
print("blue=\n",blue)
cv2.imshow("blue",blue)
#----------绿色通道----------
green=np.zeros((300,300,3),dtype=np.uint8)
green[:,:,1]=255
print("green=\n",green)
cv2.imshow("green",green)
#----------红色通道----------
red=np.zeros((300,300,3),dtype=np.uint8)
red[:,:,2]=255
print("red=\n",red)
cv2.imshow("red",red)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

程序分析

● 针对数组blue,将其第0个通道的值设置为255。从图像角度来 看,图像blue的B通道值为255,其余两个通道值为0,因此图像blue为蓝色图像。

同理,数组green的第1个通道(图像green的G通道)值为255,数组red的第1个通道(图像red的R通道)值为255。

● 从通道值设置可以看出,在OpenCV中,通道的顺序是
B→G→R 

二、生成像素值为随机数的图像

1、灰度图像

代码

import cv2
import numpy as np
img=np.random.randint(0,256,size=[256,256],dtype=np.uint8)
cv2.imshow("Grayscale",img)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

2、彩色图像

代码

import cv2
import numpy as np
img=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
cv2.imshow("Colorscale",img)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

3、程序分析

随机灰度图像和随机彩色图像差别仅在size:随机灰度图像的size=[256,256],随机彩色图像的size=[256,256,3]

区别在于随机彩色图像必随机灰度图像多了两个通道数,随机灰度图像的size也可写为size=[256,256,1]

三、使用numpy.array访问彩色图像像素

代码

import cv2
import numpy as np img=cv2.imread("demoimg.jpg")
cv2.imshow("before",img) #使用item()函数读取原图像第0行第0列位置上的 B通道、G通道、R通道三个通道上的像素值
print("修改前:")
print("(0,0,0)=",img.item(0,0,0))
print("(0,0,1)=",img.item(0,0,1))
print("(0,0,2)=",img.item(0,0,2)) #使用嵌套循环语句将位于“第0行到第49行”和“第0列到第99列”的交叉区域内的像素值赋予随机值
for i in range(0,50):
for j in range(0,100):
for k in range(0,3):
img.itemset((i,j,k),np.random.randint(0,256,dtype=np.uint8)) #使用itemset()函数对像素进行修改
cv2.imshow("after",img) #使用item()函数读取修改后图像第0行第0列位置上的 B通道、G通道、R通道三个通道上的像素值
print("修改后:")
print("(0,0,0)=",img.item(0,0,0))
print("(0,0,1)=",img.item(0,0,1))
print("(0,0,2)=",img.item(0,0,2)) #----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

  

四、感兴趣区域(ROI)

1、获取ROI

代码

import cv2

img=cv2.imread("demoimg.jpg")
roi=img[170:220,110:160] #获取ROI
cv2.imshow("original image",img) #显示原始图像
cv2.imshow("ROI",roi) #显示ROI #----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

  

2、对ROI打码

代码

import cv2
import numpy as np img=cv2.imread("demoimg.jpg",cv2.IMREAD_UNCHANGED) #读取图像,读取标记值cv2.IMREAD_UNCHANGED为保持原格式不变
cv2.imshow("original image",img) #显示原始图像
img[170:220,110:160]=np.random.randint(0,256,(50,50,3)) #将原图像的ROI用随机图像替换
cv2.imshow("result",img) #显示替换后图像 #----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

  

五、通道操作

1、通道拆分

代码

import cv2

img=cv2.imread("colorimg.jpg")  #读取图像
cv2.imshow("original image",img) #显示原图像
#分别拆分B、G、R三个通道
b,g,r=cv2.split(img)
"""
使用函数cv2.split()拆分图像通道,等价于:
b=img[:,:,0]
g=img[:,:,1]
r=img[:,:,2]
"""
#分别显示单独拆分出B、G、R三个通道的图像
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
#B通道设为0
img[:,:,0]=0
cv2.imshow("B0",img)
#G通道设为0,此时原图像的B和G通道值都为0,仅R通道有值
img[:,:,1]=0
cv2.imshow("B0G0",img) #----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

程序分析

  • 从运行结果看出,单独拆分出的通道其对应的颜色会偏白,与其相对的颜色则偏黑
  • 将指定通道值设为0后,该通道的颜色偏黑

2、通道合并

代码

import cv2

img=cv2.imread("colorimg.jpg")  #读取图像
cv2.imshow("original image",img) #显示原图像
b,g,r=cv2.split(img) #分别拆分B、G、R三个通道
#分别按照B→G→R和R→G→B顺序合并通道
bgr=cv2.merge([b,g,r])
rgb=cv2.merge([r,g,b])
#分别显示按照B→G→R和R→G→B顺序合并通道后的图像
cv2.imshow("BGR",bgr)
cv2.imshow("RGB",rgb) #----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

程序分析

从运行结果可以看出,改变通道顺序后,图像显示效果会发生变化,从纯颜色角度看,其余对应的颜色相互颠倒,但R→G→B顺序的通道红色部分相对原图偏暗。

OpenCV程序练习(二):图像处理基础的更多相关文章

  1. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  2. [Python图像处理] 一.图像处理基础知识及OpenCV入门函数

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. LINUX二十个基础命令

    LINUX二十个基础命令 一. useradd命令 1.命令格式: useradd 选项 用户名 2.命令功能: 添加新的用户账号 3.常用参数: -c comment 指定一段注释性描述.-d 目录 ...

  4. MATLAB图像处理基础

    MATLAB图像处理基础 2.2.1 图像文件格式及图像类型 1.MATLAB支持的几种图像文件格式: ⑴JPEG(Joint Photogyaphic Expeyts Group):一种称为联合图像 ...

  5. [置顶] ubuntu12.04下编译opencv程序

    ubuntu12.04下编译opencv程序 1.在ubuntu下安装好 opencv后(建议使用apt-get install 来安装) 2.使用程序FaceExaple.c来进行测试程序 #inc ...

  6. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

  7. 面试题(二)—Java基础(下)

    一.进程和线程 进程 (1)正在运行的程序,是系统进行资源分配和调用的独立单位. (2)每一个进程都有它自己的内存空间和系统资源. 线程 (1)是进程中的一条执行路径. (2)一个进程如果只有一条执行 ...

  8. OpenCV探索之路(二十四)图像拼接和图像融合技术

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...

  9. Mina 系列(二)之基础

    Mina 系列(二)之基础 Mina 使用起来多么简洁方便呀,就是不具备 Java NIO 的基础,只要了解 Mina 常用的 API,就可以灵活使用并完成应用开发. 1. Mina 概述 首先,看 ...

  10. asp.net调用opencv类库,实现图像处理显示

    asp.net调用opencv类库,实现图像处理显示     ​      原理上来说,通过dll的调用,无论是asp.net还是winform都可以调用opencv及其类库.但是在实现的过程还是有许 ...

随机推荐

  1. Threading Programming Guide:One

    苹果支持的产生线程的方式 Operation Object 使用OperationQueue,具体可以参考:Concurrency Programming Guide GCD 使用诸如dispatch ...

  2. Java面试题:Spring框架除了IOC和AOP,还有哪些好玩的设计模式?

    Spring是一个基于Java的企业级应用程序开发框架,它使用了多种设计模式来实现其各种特性和功能.本文将介绍一些在Spring中使用的常见设计模式以及相应的代码示例和说明. 单例模式 单例模式是Sp ...

  3. layui合并单元格

    在别人的基础上解决了多列合并和同一个页面多个表格的问题 1 //合并单元格 2 function merge(id,res, columsName, columsIndex) { 3 4 var da ...

  4. (1)semantic-kernel入门课程

    (1)semantic-kernel入门课程 获取OpenAI在线API 由于在国内的限制,我们并没有办法直接访问OpenAI,所以下面的教程我们会推荐使用https://api.token-ai.c ...

  5. jupyter notebook无法找到自己的虚拟环境

    1:打开cmd/Anaconda Prompt/Anaconda Powershell Prompt 2:进入虚拟环境conda activate 环境名 3:conda list查看有无ipyker ...

  6. Swoole 源码分析之 Coroutine 协程模块

    首发原文链接:Swoole 源码分析之 Coroutine 协程模块 大家好,我是码农先森. 引言 协程又称轻量级线程,但与线程不同的是:协程是用户级线程,不需要操作系统参与.由用户显式控制,可以在需 ...

  7. RTMP推流FLV插入自定义SEI数据总结

    一.需求 在RTMP推送的流中添加一个接口,可以添加自定义的数据(一段字节数组). 经过分析,在H264的流中可以通过SEI添加自定义数据,下面是实施的总结 二.实施 1)准备工具 RTMP推流客户端 ...

  8. 为何Mysql数据库上读和代码读取的数据不一致

    上周,做了一个同步删除的功能,具体流程是,数据库删除-->调用第三方运行删除接口,同步删除. 具体流程 数据库删除数据后,这里使用标志删除,再调用第三方数据. 在调用第三方数据之前需要通过id查 ...

  9. 剑指Offer-54.字符流中第一个不重复的字符(C++/Java)

    题目: 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前 ...

  10. realtek高清晰音频管理器 WIN10

    在WIN10里已经改名了: Realtek Audio Console . 在安装realtek声卡驱动后,Realtek Audio Console 会自动安装.