python 图像处理分离图像通道

OpenCV读取和显示图片 | 柠檬树博客
当前位置&:& / /OpenCV读取和显示图片
一、从文件读取图像并显示
在这篇文章的最后给出了一个简单的Demo,这个例子跟本篇使用的例子是一样的。打开C++ IDE并创建一个新的项目,新建一个源文件,粘贴下面的代码:
#include &opencv2\highgui\highgui.hpp&
#include &iostream&
int main(int argc, const char** argv)
Mat img = imread("earth.jpg", CV_LOAD_IMAGE_UNCHANGED);
if (img.empty())
cout && "图像加载失败!" &&
//system("pause");
return -1;
//创建一个名字为MyWindow的窗口
namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
//在MyWindow的窗中中显示存储在img中的图片
imshow("MyWindow", img);
//等待直到有键按下
waitKey(0);
//销毁MyWindow的窗口
destroyWindow("MyWindow");
在运行程序之前,将图片文件(earth.jpg)放到C++文件所在的目录。运行程序,如下图所示:
下面我来解释一下这个程序。
#include &opencv2\highgui\highgui.hpp&
imread(), namedWindow(), imshow() 和 waitKey() 函数都声明在这个头文件中,所以笔记得包含它。
上面的程序中还是用了Mat数据结构,它在”opencv2/core/core.hpp”中声明的,那为什么没有包含它呢?这是因为在”opencv2/highgui/highgui.hpp”头文件中已经包含了core.hpp头文件,所以不用在我们的程序再次包含了。
“opencv2/core/core.hpp” 和 “opencv2/highgui/highgui.hpp中所有的数据结构和函数都声明在cv命名空间,所以,必须在我们程序的头部使用它,否则就要在每个OpenCV的函数和数据结构前面都要加上”cv::”(例如:cv::Mat,cv::imread()等等)。
Mat img = imread("earth.jpg", CV_LOAD_IMAGE_UNCHANGED);
Mat是在矩阵中存储图片的数据结构,它声明在 “opencv2/core/core.hpp”头文件中。
imread()是声明在 “opencv2/highgui/highgui.hpp”的函数,它从文件加载一个图片并存储在Mat数据结构中。
imread()函数的声明如下:
CV_EXPORTS_W Mat imread( const string& filename, int flags=1 );
它的参数:
filename —— 文件的位置。如果只提供文件名,那么文件应该和C++文件在同一目录,否则必须提供图片的全路径。
flags —— 有5个可能的输入。
CV_LOAD_IMAGE_UNCHANGED – 在每个通道中,每个像素的位深为8 bit,通道数(颜色)保持不变。
CV_LOAD_IMAGE_GRAYSCALE – 位深=8 bit 通道数=1(颜色变灰)
CV_LOAD_IMAGE_COLOR -位深=?, 通道数=3
CV_LOAD_IMAGE_ANYDEPTH – 位深不变 ,通道数=?
CV_LOAD_IMAGE_ANYCOLOR – 位深=?, 通道数不变
上面的值还可以组合使用,比如:
CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR – 位深不变,通道数比便
CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH – 位深不变,通道数=3
如果你不确定使用哪个,就是用CV_LOAD_IMAGE_COLOR 。
要理解位深和通道的概念,应该熟悉图像处理的理论知识,所以下面讨论一点这方面的内容。
所有的数字图像都是由像素组成的,所有的像素都有值。一个像素的最小值为0,表示黑色。像素的值变大,它的亮度也会增强。每个像素分配的比特的固定数值是255(十进制),也就是说每个像素分配8个bit。所以一个像素的最大值为255(二进制为)。
那么什么是位深呢?位深就是为每个像素分配的比特。如果比特是8,每个像素的值可以是0-255。如果是4,每个像素的值可是0-15(二进制中为1111)。
下面是一个8 bit位深的图片的简单模型。每个小矩形表示一个像素。所以每个矩形包含一个0-255的值。
这张图像的一些属性:
一个通道(所以这是一个灰度图像)
分辨率为4×5
这是一个灰度图像(黑白图像),因为该图像没有颜色内容。像素的值越高,图像就会越亮。像素值越低,图像就会越暗。
下面是一个彩色图像的简单模型。彩色图像至少包含3个平面:Red,Green和Blue。使用这3种颜色的特定组合可以创建任何颜色。所有的像素都是这3种颜色值的组合。(255,0,0)表示pure red。(0,255,0)表示pure green。(255,0,255)表示pure violate。它的位深为24,因为每个像素为8×3 bit (每个通道8 bit)。
这张图像的一些属性:
位深24 bit
3个通道(所以是彩色图像)
分辨率为4×5
上面的模型,左上角的像素是(23,231,46)。它会显示为呈绿色的颜色,因为green值(231)比red(23)和blue(46)都大。
if (img.empty())
如果imread()函数加载图像失败,’img’不会加载任何数据,因此,img.empty()应该返回true。检查是否成功加载,如果没有则退出程序是一个好的做法,否则当调用imshow()函数时,程序就会崩溃。
bool Mat::empty()
如果Mat::data==NULL或Mat::total()==0,这个函数返回true。
system("pause");
如果使用Visual Studio,这行注释的注释最好取消,因为它会暂停程序,知道用户按下任意键。如果不取消注释,程序会立即退出,用户也就不会看到错误信息了。
void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
这个函数创建一个窗口。它的参数如下:
winname——窗口的名字。这个名字会显示在窗口的标题栏上。
flags——决定窗口的尺寸。有如下选项:
WINDOW_AUTOSIZE – 用户不能改变图像的尺寸,图像显示为它的原有尺寸
CV_WINDOW_NORMAL – 调整窗口图像的尺寸可以改变
void imshow(const string& winname, InputArray mat);
这个函数在指定名字的窗口中显示存储在mat中的图像。如果窗口使用WINDOW_AUTOSIZE创建的,图像会显示为它的原始尺寸,否则图像会调整到窗口的尺寸大小。
它的参数:
winname -窗口的名字。这个名字是namedWindow()函数创建窗口时使用的
mat – 存储图像数据的Mat对象
int waitKey(int delay = 0)
waitKey()函数通过指定delay(毫秒)等待按键的时间。如果delay是0或负数,它会永久等待。如果任意键被按下,这个函数就会返回按下键的ASCII值,程序继续执行。如果指定的时间没有按下键,它返回-1,程序继续执行。
void destroyWindow(const string& winname)
这个函数关闭名字为winname的打开的窗口并释放关联的内存。这个函数对这个程序来说不是必须的,因为当程序退出,操作系统通常会关闭所有打开的窗口并释放关联的内存。
当运行程序,图像”earth.jpg”被加载到Mat类型的变量”img”。然后一个名字为”MyWindow”的窗口打开,接着”img”被加载到窗口中。窗口和图像一起显示,直到按下任意键。
二、创建一个空图像并显示
这个程序和前一个非常像,唯一的不同就是这个程序创建了一个空图像,而不是从文件中加载已存在的图像。
#include &opencv2\highgui\highgui.hpp&
#include &iostream&
int main(int argc, const char** argv)
Mat img(500, 1000, CV_8UC3, Scalar(0, 0, 100)); //创建一个图像 ( 3个通道, 8 bit位深, 高500, 宽1000, (0, 0, 100) 分别分配给 Blue, Green and Red. )
if (img.empty())
cout && "图像不能加载!" &&
//system("pause");
return -1;
namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
imshow("MyWindow", img);
waitKey(0);
destroyWindow("MyWindow");
运行结果如下图:
OpenCV的新函数
Mat::Mat(int rows, int cols, int type, const Scalar& s);
这是Mat的一个构造函数。它使用Scalar对象给定的值初始化Mat对象。
它的参数:
rows – 2维矩阵的行数 (图像的高度像素)
cols – 2维矩阵的列数 ( 图像的宽度像素)
type – 指定图像的位深,数据类型和通道数。我提供 CV_8UC3 ,指定3个通道的8 bit无符号整数,下面是这个参数一些可能的输入值:
CV_8UC1 – 单通道8 bit无符号整数
CV_8UC3 – 3通道8 bit为无符号整数
CV_64FC1 – 单通道64 bit 浮点数
如果想详细了解这方面的内容,请参见一文的“阵列的数据类型”部分。
s – 使用s给定的值初始化矩阵的每个元素。在上面的程序中,给定Scalar(0,0,100),因此,它使用0初始化第一个通道(Blue),0初始化第二个通道(Green),100初始化第三个通道(Red)。所以,最终的图像是red。
在这个程序中,我创建了一个高500,宽1000,有3个通道的图像。每个通道的每个像素分配8 bit的无符号整数(每个像素 8×3=24 bit),每个像素使用(0,0,100)指定值。这意味着,第一个通道总是0,第二个通道也总是0,第三个通道总是100,因此,最终看到的是一个red的图像。
本文链接地址:
- 19,471 浏览数
- 9,626 浏览数
- 8,429 浏览数
- 7,749 浏览数
- 7,214 浏览数
- 6,212 浏览数
- 5,064 浏览数
- 4,133 浏览数
- 3,034 浏览数
- 2,813 浏览数Python Imaging Library 中文手册PIL中文手册PIL,pil
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Python Imaging Library 中文手册PIL中文手册
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口python OpenCV 读取图片显示和复制 (二)
编辑:www.fx114.net
本篇文章主要介绍了"python OpenCV 读取图片显示和复制 (二)",主要涉及到python OpenCV 读取图片显示和复制 (二)方面的内容,对于python OpenCV 读取图片显示和复制 (二)感兴趣的同学可以参考一下。
读取和显示图像
#读取和显示图像
def showimg(imagePath):
img = cv2.imread(imagePath)
#读取本地图片,目前OpevCV支持bmp、jpg、png、tiff
cv2.namedWindow(&Image&)
#创建一个窗口用来显示图片
cv2.imshow(&Image&, img)
cv2.waitKey (0)
#等待输入,这里主要让图片持续显示。
cv2.destroyAllWindows()
if __name__ == '__main__':
imagePath = 'mini.jpg'
showimg(imagePath)
新的OpenCV 中没有CreateImage 接口,即没有cv2.CreateImage 这个函数。如果要创建图像,需要使用Numpy的函数。
所以图像使用Numpy数组的属性来表示图像的尺寸和通道信息。如果输出img.shape 得到(500,375,3),3 -- 表示这是个RGB图像。
emptyImage = np.zeros(img.shape,np.uint8)
#根据图像的大小来创建一个图像对象
emptyImage2 = img.copy()
还可以用cvtColor 获得原图像的副本
emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#emptyImage3[...]=0
emptyImage3[...]=0是将其转成空白的黑色图像。
cv2.imwrite(&D:\test.jpg&,img)
第一个参数是保存文件名和路径,第二个是图像矩阵。imwrite() 有个可选的第三个参数
cv2.imwrite(&D:\test.jpg&,img,[int(cv2.IMWRITE_JPEG_QUALITY),5])
5 -- 是第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95
& & & 注意: cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int.,对于png ,第三个参数表示的是压缩级别。
& & & cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小。默认为3.
cv2.imwrite(&./cat.png&, img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
cv2.imwrite(&./cat2.png&, img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
测试完整代码
import cv2
import numpy as np
img = cv2.imread(&./cat.jpg&)
emptyImage = np.zeros(img.shape, np.uint8)
emptyImage2 = img.copy()
emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#emptyImage3[...]=0
cv2.imshow(&EmptyImage&, emptyImage)
cv2.imshow(&Image&, img)
cv2.imshow(&EmptyImage2&, emptyImage2)
cv2.imshow(&EmptyImage3&, emptyImage3)
cv2.imwrite(&./cat2.jpg&, img, [int(cv2.IMWRITE_JPEG_QUALITY), 5])
cv2.imwrite(&./cat3.jpg&, img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
cv2.imwrite(&./cat.png&, img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
cv2.imwrite(&./cat2.png&, img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
cv2.waitKey (0)
cv2.destroyAllWindows()
参考和转载地址:
http://blog.csdn.net/sunny2038/article/details/9057415
本文标题:
本页链接:我流PNG图像从我的iPhone到我的MacBook通过TCP。 MacBook的代码是从怎样的形象与OpenCV的转换? PNG格式被选中它们是有效的,但其他格式可以
我写了一个测试程序,从文件中读取的rawImage,但不知道如何将它转化成:
# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
# Not sure how to convert rawImage
npImage = np.array(rawImage)
matImage = cv2.imdecode(rawImage, 1)
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0)
本文地址 :CodeGo.net/482550/
-------------------------------------------------------------------------------------------------------------------------
1. 另一种方式,
也是在阅读一个实际的文件的情况下,这将适用于一个unicode路径(在Windows上进行测试)
with open(image_full_path, 'rb') as img_stream:
file_bytes = numpy.asarray(bytearray(img_stream.read()), dtype=numpy.uint8)
img_data_ndarray = cv2.imdecode(file_bytes, cv2.CV_LOAD_IMAGE_UNCHANGED)
img_data_cvmat = cv.fromarray(img_data_ndarray) # convert to old cvmat if needed
(你的问题似乎被标记的Objective-C,但你问的Python,所以是你的榜样,所以我'的。)
我的优先篇文章对堆栈溢出!
简历。似乎是你在找什么。
的LoadImage(iscolor=CV_LOAD_IMAGE_COLOR)→无
Loads an image from a file as an IplImage.
Parameters:
filename (str) – Name of file to be loaded.
iscolor (int) –
Specific color type of the loaded image:
CV_LOAD_IMAGE_COLOR the loaded image is forced to be a 3-channel color image
CV_LOAD_IMAGE_GRAYSCALE the loaded image is forced to be grayscale
CV_LOAD_IMAGE_UNCHANGED the loaded image will be loaded as is.
该函数cvLoadImage加载图像从指定的文件和
返回的指针加载的图像。目前,下列文件
格式支持:
Windows bitmaps - BMP, DIB
JPEG files - JPEG, JPG, JPE
Portable Network Graphics - PNG
Portable image format - PBM, PGM, PPM
Sun rasters - SR, RAS
TIFF files - TIFF, TIF
注意 CodeGo.net,在当前的alpha通道,如果有的话,是
从输出图像除去,例如4通道的RGBA图像会
加载为RGB。
我想通了:
# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
# Convert rawImage to Mat
pilImage = Image.open(StringIO(rawImage));
npImage = np.array(pilImage)
matImage = cv.fromarray(npImage)
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0)
本文标题 :如何从python中opencv的数组读取原始PNG?
本文地址 :CodeGo.net/482550/
Copyright (C) 2014 CodeGo.net 沪ICP备号 联&系& c&o&d&e&g&o &@&1&2&6&.&c&o&m转载请注明:@小五义QQ群:
一、主要函数
1、 cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片,包括cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道。
2、cv2.imshow():创建一个窗口显示图片,共两个参数,第一个参数表示窗口名字,可以创建多个窗口中,但是每个窗口不能重名;第二个参数是读入的图片。
3、cv2.waitKey():键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入。
4、cv2.destroyAllWindows():删除建立的全部窗口。
5、cv2.destroyWindows():删除指定的窗口。
6、cv2.imwrite():保存图片,共两个参数,第一个为保存文件名,第二个为读入图片。
1、以下面的图片为例
2、显示并保存彩色图片
# -*- coding: utf-8 -*-
@xiaowuyi:/xiaowuyi
import cv2
img=cv2.imread('1.jpg',cv2.IMREAD_COLOR)# 读入彩色图片
cv2.imshow('image',img)#建立image窗口显示图片
k=cv2.waitKey(0)#无限期等待输入
if k==27:#如果输入ESC退出
cv2.destroyAllWindows()
elif k==ord('s'):#如果输入s,保存
cv2.imwrite('test.png',img)
print "OK!"
cv2.destroyAllWindows()
&显示结果:
3、显示并保存黑白图片
# -*- coding: utf-8 -*-
@xiaowuyi:/xiaowuyi
import cv2
img=cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE)# 读入彩色图片
cv2.imshow('image',img)#建立image窗口显示图片
k=cv2.waitKey(0)#无限期等待输入
if k==27:#如果输入ESC退出
cv2.destroyAllWindows()
elif k==ord('s'):
cv2.imwrite('test.png',img)
print "OK!"
cv2.destroyAllWindows()
&显示结果:
阅读(...) 评论()}

我要回帖

更多关于 python 图像处理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信