一、彩色图像像素处理

代码

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. linux上PGI编译器安装

    1.PGI编译器介绍 随着英伟达的收购,PGI编译器已经已经并入NVIDIA HPC SDK.后面直接安装NVIDIA HPC SDK即可. NVIDIA HPC SDK提供了使用标准的C/C++和F ...

  2. d3d12龙书阅读----绘制几何体(上) 课后习题

    d3d12龙书阅读----绘制几何体(上) 课后习题 练习1 完成相应的顶点结构体的输入-布局对象 typedef struct D3D12_INPUT_ELEMENT_DESC { 一个特定字符串 ...

  3. dotnet c# samples core nativeaot NativeLibrary

    如何在 System.Text.Json 中使用源生成 https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-t ...

  4. Dubbo实战教程

    "Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案." ...

  5. 关于Zotero组件在office word中的添加

    引言:学姐问我,怎么弄Zotero,在调试过程中遇到的问题及解决方案 Q&A Zotero的安装 找到官网(https://www.zotero.org/)点击download,安装(个人觉得 ...

  6. linux系统重要文件和目录说明

    系统信息相关文件 /etc/issue 记录操作系统版本 head /etc/issue /proc/cpuinfo 记录cpu信息 cat /proc/cpuinfo /proc/meminfo 记 ...

  7. containerd 源码分析:创建 container(三)

    文接 containerd 源码分析:创建 container(二) 1.2.2.2 启动 task 上节介绍了创建 task,task 创建之后将返回 response 给 ctr.接着,ctr 调 ...

  8. Centos Stream 10 测试版下载:未来的RHEL10&Rocky Linux 10

    简介 最近发现Centos最放出了Stream 10 测试版本,应该是基于Fedora 40构建的.未来红帽会基于此版本构建RHEL 10. 内核版本:6.9.0 Python版本:3.12.2 RH ...

  9. vue组件间传值 父组件向子组件传值

    ² 父组件以属性的形式绑定值到子组件身上 ² 子组件通过使用属性props接收(props是单向绑定的(只读属性):当父组件的属性变化时,将传导给子组件,但是反过来不会) 第1步,父组件以动态属性的方 ...

  10. Manim使用心得

    Manim 使用心得 manim 做视频还是挺方便的. 当然,如果你每一次都从 0 开始写,那么你会崩溃. 所以需要找到自己做视频的风格,以此总结出一套通用的 python 模板代码,然后调用. 例如 ...