2017-05-16 17:11:12 dlhlSC 阅读数 1761

1. scipy.misc

#coding=utf=8
import scipy.misc as misc
"""
本程序用于测试misc.imresize的size中h和w的顺序
"""
path='test.jpg'
img = misc.imread(path)
print(img.shape)
w,h=20,100
img=misc.imresize(img,(w,h,3),interp='bilinear')
print("改变尺寸后的size\n",img.shape)
misc.imsave("testScipyAPI.jpg", img)

输出结果

(375, 500, 3)
改变尺寸后的size
 (20, 100, 3)

shape是按照图像高、宽、通道来输出的,在程序中w=20, 但是resize后的高度为20, 宽为100,由结果可知

misc.imresize中参数是先高后宽,即misc.imresize(img,(h,w,3),interp='bilinear')

2. cv2

#coding=utf=8
import cv2
"""
本程序用于测试cv2.resize的size中h和w的顺序
"""
path='test.jpg'
img = cv2.imread(path)
print(img.shape)
w,h=20,100
img=cv2.resize(img,(w,h))
print("改变尺寸后的size\n",img.shape)
cv2.imwrite("testcvAPI.jpg", img)

输出结果

(375, 500, 3)
改变尺寸后的size
 (100, 20, 3)

根据结果可知:
cv2.resize是先宽后高,即cv2.resize(img,(w,h))

2018-04-25 20:51:31 forever0_0love 阅读数 1245

一、图片的读取显示以及保存

1.读取及显示

"""
skimage的子模块
子模块名称      主要实现功能
io     读取、保存和显示图片或视频
data     提供一些测试图片和样本数据
color     颜色空间变换
filters     图像增强、边缘检测、排序滤波器、自动阈值等
draw     操作于numpy数组上的基本图形绘制,包括线条、矩形、圆和文本等
transform     几何变换或其它变换,如旋转、拉伸和拉东变换等
morphology     形态学操作,如开闭运算、骨架提取等
exposure     图片强度调整,如亮度调整、直方图均衡等
feature     特征检测与提取等
measure     图像属性的测量,如相似性或等高线等
segmentation     图像分割
restoration     图像恢复
util     通用函数
"""
from skimage import io
picture = io.imread("C:/Users/huyuan/Pictures/Camera Roll/1.jpg")# 图片路径
io.imshow(picture)

输出如上图所示(选了一张壁纸)

picture = io.imread('C:/Users/huyuan/Pictures/Camera Roll/1.jpg',as_grey = True)#读取灰度图并显示
io.imshow(picture)

2.保存

""" 
保存图片,格式自由选择,之前jpg现在存为tif格式
"""
io.imsave('C:/Users/huyuan/Pictures/Camera Roll/1.tif',picture)

二、图片信息的显示

picture = io.imread("C:/Users/huyuan/Pictures/Camera Roll/1.jpg")
"""
打印图片信息
"""
print(picture)
print(type(picture))
print(picture.shape)
print(picture.size)
print(picture.min())
print(picture.max())

结果:

        

三、归一化(normalize)

# 图片中的所有像素点加减同一个值,并不会提示维度不一致,和乘除法一样
# picture -= picture.min() #由于其最小值为0,所以picture不变
picture -= 100
print(picture)
"""
图片进行归一化,

"""
picture -= picture.min()
picture = picture / picture.max()
#picture = picture * 255.0
print(picture)
#io.imshow(picture)

这里结果就不截图了。

后续边看边学吧

2017-09-13 00:05:56 zhangfuliang123 阅读数 2361

1、矩形检测和字符识别
2、读出图片中仪表的读数

3、C/C++内存分配方式

a: 静态存储区:内存在编译的时候就已经分配好,直到程序结束都存在,例如全局变量,static变量

b:栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等,是一种向低地址扩展的数据结构,内存的分配是连续的。函数执行完成后自动释放。栈的分配效率很高(相比于堆分配),但是容量有限,VC6下只有1M。

c:堆区:由程序员分配释放,如果程序员没有释放掉,程序结束后,由OS回收,是一种向高地址扩展的数据结构,内存的分配的是不连续的。动态内存分配,C:malloc/free   C++:new/delete.堆的效率要比栈低得多,但是容量比较大,可以达到4G。

如果比较栈和堆的区别,可以从以下几个方式:申请释放方式不同、申请空间大小不同、申请效率的不同、以及碎片问题。

经典例子:

//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

参考:http://blog.csdn.net/shanchangyi/article/details/51854795

4、面向过程编程和面向对象编程

a、面向过程是一过程为中心的的编程思想,分析出解决问题的需要的步骤,然后一步步实现,是流程化的。通常数据和对数据的操作是分离的。面向对象就是把问题抽象成具有行为(函数)和属性(数据)的一个个对象,然后分别设计这些对象,通常是数据和对数据的操作是绑定在一起的。

b、面向对象拥有三大特征:封装、继承、多态面向对象的代码更加支持重用,注重功能的复用。

封装:把客观事物封装成抽象的类,隐藏属性和方法的实现细节,仅对外公开接口。

继承:子类可以使用父类的所有功能,并且对这些功能进行扩展。继承的过程,就是从一般到特殊的过程。

多态:接口的多种不同的实现方式即为多态。同一操作作用于不同的对象,产生不同的执行结果。在运行时,通过指向基类的指针或引用来调用派生类中的虚函数来实现多态。

封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的类。它们的目的都是为了—代码重用。

而多态则是为了实现另一个目的—接口重用。


5、走格子,比如(0,0)到(5,7)
4、字符串数字转换为整数 "12345" to 12345
5、虚函数的作用以及实现机制

2012-02-02 17:57:12 ColaWJY 阅读数 891

昨晚上到今天成果不小,至少做出了大致的系统程序结构框架:

(前两天是处理如何外部载入图片,然后显示在界面上),大体结构是,1.先读取图片,显示在界面,2.然后设置索引文件目录(即图像索引库),3.然后递归查找指定图像目录的  指定后缀的文件,4.再一个个的调用函数 与原始图像进行对比处理,得到每个的相似度。对于相似度符合一定阈值的,将图像句柄添加到ImageList中,最后在一次性将Imagelist添加到界面绑定的ListBox Control 控件变量中,并显示。

   大体思路是这样,不过实现过程中的确遇到了不少问题,因为我本是对MFC菜鸟级别,所以想实现什么功能都是上网搜索,然后改成适用于自己的代码,左拼右凑当然一大堆问题。

1.设置索引文件目录,这里涉及到个线程问题 ,(我也不太明白为什么那个作者要重新设置线程),不过作为引用者,我的发现与遇到的问题是:新建线程(相关代码 CWinThread* pThreadAsu = AfxBeginThread(DoRecursive, this);)时候调用的函数:是静态函数(DoRecursive一定要声明成 UINT __cdecl CSearchImgDlg::DoRecursive( LPVOID lpParam )形式)。而且在静态函数中,一定必须调用静态变量,否则会报错【error C2597对非静态成员CSearchImgDlg  m_ListImage的非法引用】,

解决方法:

UINT __cdecl CSearchImgDlg::DoRecursive( LPVOID lpParam )

{

 CSearchImgDlg *p = (CSearchImgDlg *) lpParam;   //lpParam是线程传递的参数
 CWnd *w;

 //获得界面的控件的操作权

 w = (CWnd*) p->GetDlgItem(IDC_BT_OpenFile);  ////控件ID
 w->EnableWindow(FALSE);   ////设置控件ID属性

//调用本类中的各种方法,或自定义方法/ 或引用类变量

p->MessageBox("初始化image list");

p->类变量;

p->类自定义方法;

}

2.如何将图像句柄添加到ImageList中,参加源码:http://blog.csdn.net/byxdaz/article/details/4621328

我改用的时候,遇到两个错误,一个是我的CxImage库中没有Resample2()方法,所以我搜索了Resample()方法,其实一样,Resample()方法介绍 推荐网址:http://hi.baidu.com/altiplano/blog/item/d17b62632a0396650c33fac4.html

二是没创建就向ImageList添加图片,结果运行中出现终止错误,估计可能溢出了,后来看了http://www.cppblog.com/totti1006/archive/2007/11/02/35764.aspx才明白,要先create,才能用

解决方法:

m_ListImage.Create(100, 60, ILC_COLOR32 | ILC_MASK, 0, 1);//前两个是图片的宽和高,倒数第二个是创建张数

然后再m_ListImage.Add(pBitmap,RGB(255,0,255));//运行就没问题了

3.将ImageList添加到ListBox Control 控件变量中,参考代码http://www.codeproject.com/Articles/2002/CListBoxST-a-CListBox-derived-control,不知道是不是因为在另一个线程方法中调用的缘故,listbox不显示添加的imageList,

不过后来我在线程函数,在ImageList添加到ListBox Control 后,加入p->m_ListResult.AddString(_T("测试"), i);(即添加完图片后,又仿着例子添加了静态文本)结果竟然显示了,— —诶,搞不懂,不过这里需要改进。

 

后面还有许多需要测试和改进。。先写到这里。。

 

 

 

2019-10-10 18:53:51 June_Xixi 阅读数 24

实验1.1:图像加载、显示

利用图像库的功能,实现从文件加载图像,并在窗口中进行显示的功能;利用常见的图像文件格式(.jpg; .png; .bmp; .gif)进行测试。

*这里是指gif格式的静态图片。

代码:

import cv2
 
# 读取并显示图像
img = cv2.imread("images/c.gif")
# 接着创建一个窗口
cv2.namedWindow("Image")
# 显示图像
cv2.imshow("Image", img)
# 等待按键用来展示图片
cv2.waitKey(0)
# 释放窗口
cv2.destroyAllWindows()


实验1.2:图像合成

•现有一张4通道透明图像a.png:

–从其中提取出alpha通道并显示;

–用alpha混合,为a.png替换一张新的背景(背景图自选);

*注意两个图片的像素需要一致

a.png:

背景图d.jpg:

结果:

代码:

# coding=utf-8
import numpy as np
import cv2
 
#读入图像
img = cv2.imread("a.png", -1)
# 将通道分离
b,g,r,a = cv2.split(img)
#得到PNG图像的alpha通道,即alpha掩模
alpha = cv2.merge((a,a,a))
# 保存alpha图像
cv2.imwrite("alpha.jpg",alpha)
# 显示alpha通道
cv2.imshow("alpha",alpha)
cv2.waitKey(0)
 
#背景图片
background = cv2.imread("d.jpg")
#得到PNG图像前景部分,除去Alpha通道的部分
foreground = cv2.merge((b,g,r))
#因为下面要进行乘法运算故将数据类型设为float,防止溢出
foreground = foreground.astype(float)
background = background.astype(float)
#将alpha的值归一化在0-1之间,作为加权系数
alpha = alpha.astype(float)/255
#将前景和背景进行加权,每个像素的加权系数即为alpha掩模对应位置像素的值,前景部分为1,背景部分为0
foreground = cv2.multiply(alpha,foreground)
background = cv2.multiply(1-alpha,background)
outImage = foreground + background
 
cv2.imwrite("outImage.jpg",outImage)
cv2.imshow("outImg",outImage/255)
# 等待按键用来展示图片
cv2.waitKey(0)
# 释放窗口
cv2.destroyAllWindows()

 

没有更多推荐了,返回首页