python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算

图像的基本操作

在上个教程中,我们介绍了使用鼠标画笔的功能。本次教程,我们将要谈及OpenCV图像处理的基本操作。

本次教程的所有操作基本上都和Numpy相关,而不是与OpenCV相关。要使用OpenCV编写更好的优化代码,需要Numpy的丰富知识。

1.查看和修改像素值

我们要想查看一幅图像中某一个像素点的像素值,首先需要进行定位,将其坐标标定,我们先来看一个彩色图像(仍然是我们的猫咪,本次教程它是我们的主角):

d0a58deff749fcaec509c55f475f09cb.png

现在我想查看某一个坐标的像素值,我们在pycharm中输入代码:

import cv2import numpy as npimg = cv2.imread("cat.jpg")#获取像素值px = img[200,200]print(px)

代码为查看图像坐标(200,200)处的像素值,我们来看结果:

c31f3cbe882cc31e2d62ea848b8d6de7.png

在之前的教程中我们谈到,OpenCV对于图像的读取并非是RGB通道,而是BGR通道,那么程序输出的[178,189,186]则分别对应于BGR的像素,我们可以进行验证:

import cv2import numpy as npimg = cv2.imread("cat.jpg")#获取像素值px = img[200,200]B = img[200,200,0]G = img[200,200,1]R = img[200,200,2]print(px,B,G,R)

1f9119fef867fcb94568ed11b196d3b8.png

现在我们假设,如果图像并非彩色,而是黑白的灰度图像,那么将会怎么输出?先进行实验:

443a0aa272c54d8b91f7572331bd2b9f.png

我们仍然用刚刚的代码进行实验(前提是图像已经灰度化处理,这在后面会讲到),效果:

36455a7c411d02e630924c98f5569d44.png

可以看到,BGR的像素一致,我们得出一个结论:对于灰度图像,其输出的像素值本质上为它的亮度强度值,值的范围为0-255之间,当为0时,则全部为黑色,相反则为白色。

接下来我们来修改像素值,将指定坐标的像素值用一个数组进行赋值:

import cv2import numpy as npimg = cv2.imread("cat1.jpg")#获取像素值px = img[200,200]print(px)img[200,200] = [225,225,225]print(img[200,200])

查看输出:

834f65abef8d834bcf6633fa7755337a.png

可以看到,初始像素值跟修改之后的像素值。

一般来说,数组通常选择的是某一片区域,比如头几行或者最后几列。而对于某个像素点的访问,Numpy数组方法,array.item() 和array.itemset()有着更好的作用。但是它返回的是一个标量。所以如果我们想访问所有的B,G,R值,就需要分开调用array.item(),我们来看代码(仍然以坐标200,200为例):

import cv2import numpy as npimg = cv2.imread("cat.jpg")#获取像素值px = img[200,200]print(px)print(img.item(200,200,0))

我们用item输出像素的B值,也就是蓝色像素的数值:

f7c67d9aa0b57e1c6b4d91a3f6695ef0.png

实验可以看到,跟之前的效果是一样的。

对于指定坐标的赋值,我们使用itemset函数可以精确到某个像素,比如现在我只对蓝色像素的数值进行改变:

import cv2import numpy as npimg = cv2.imread("cat.jpg")#获取像素值px = img[200,200]print(px)print(img.item(200,200,0))img.itemset((200,200,0),100)print(img.item(200,200,0))

11bccaa67ba3e75e0c69f9f2d15e6487.png

可以看到,对于指定的颜色通道的赋值时完全可以的。

2.查看图像属性

现在将要对图像的各个属性进行研究,图像属性包括行数、列数和通道数,图像数据类型,像素数等。

对于一个图像,我们使用shape可以返回行数、列数以及颜色通道的元数:

import cv2import numpy as npimg = cv2.imread("cat.jpg")print(img.shape)

291c487668cb14f76bbe16c2c7730f3f.png

输出的第三个数值代表的是图像的BGR三个通道的元数,也就是3。现在我们使用灰度图像做实验:

import cv2import numpy as npimg = cv2.imread("cat.jpg")img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)print(img.shape)

灰度图像在之后的教程中会进行讲解,这里先用做实验:

6397e00ccb2c10d09f67ffc1771b09bf.png

可以看到,如果图像是灰度的,则返回的元组仅包含行数和列数,因此这是检查加载的图像是灰度还是彩色的好方法。

通过size可以返回当前图像的所有的像素点的总数:

import cv2import numpy as npimg = cv2.imread("cat.jpg")print(img.size)

977dbc856c6466dd2c119d996de9a358.png

图像的数据类型可以通过dtype获得:

import cv2import numpy as npimg = cv2.imread("cat.jpg")print(img.dtype)

a3450040e231e4fdf37310312bf1d539.png

imread函数默认读取图像的格式就是uint8,所以返回的全部都是这个格式。在以后我们学习深度学习框架时会发现,uint8的图像数据格式用来进行模型训练时,做数据归一化(预处理阶段)会导致精度缺失,最后导致分割精度下降。当然这是后话,我们现在不提。

如果我们想修改图像的格式,我们需要用到astype函数,现在将图像修改为float32格式的(这种格式的图像被广泛的应用于深度学习的模型训练):

import cv2import numpy as npimg = cv2.imread("cat.jpg").astype(np.float32)print(img.dtype)

bb3811f6a463c08f92d8c85f63ce6e51.png

dtype在调试时非常重要,因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的,我们在以后的学习中会经常遇到这些问题。

3.图像ROI

对于图像中的特定区域的选取我们称之为ROI,其实际上就是对图像的xy坐标进行操作,我们来看示例:

import cv2import numpy as npimg = cv2.imread("cat.jpg")husky = img[1:240,60:270]cv2.imshow("img",husky)cv2.waitKey(0)cv2.destroyAllWindows()

f69d26920b3ca12e24ad9bb69fa687dd.png

本质相当于截取某一部分图片,现在我们来做一些有意思的操作,将截取部分覆盖到图像的其他地方,本质相当于前面讲过的像素修改:

import cv2import numpy as npimg = cv2.imread("cat.jpg")husky = img[1:240,60:270]img[61:300,270:480] = huskycv2.imshow("img",img)cv2.waitKey(0)cv2.destroyAllWindows()

b169b6b21feafe343b43d09ad982acb9.png

4.分割和合并图像通道

有时我们需要在B,G,R通道图像上单独进行操作。在这种情况下,需要将BGR图像分割为单个通道。需要使用split函数与merge函数,它们的作用分别为分离和合并:

b,g,r = cv2.split(img) #拆分图像通道img = cv2.merge((b,g,r))

此操作可以将BGR三通道分离出来,从而可以对某一通道进行操作,比如现在我们将R像素全部设置为0:

import cv2import numpy as npimg = cv2.imread("cat.jpg")b,g,r = cv2.split(img) #拆分图像通道img[:,:,2] = 0r = img[:,:,2]img = cv2.merge((b,g,r))cv2.imshow("img",img)cv2.waitKey(0)cv2.destroyAllWindows()

r则为R通道,看效果:

dac4e6f6bb05f49188b79455311a12d1.png

将红色通道去除后,我们的猫咪变的有点绿了。当然,大家还可以进行其他的通道的实验。

5.图像边框填充

如果要在图像周围创建边框(如相框),则可以使用函数cv2.copyMakeBorder()。它在卷积运算(很重要),零填充等方面有更多应用。

此函数采用以下参数:

cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])

♦ src—输入图像

♦ top,bottom,left,right—相应方向上像素数的边框宽度

♦ value—cv2.BORDER_CONSTANT,cv2.BORDER_REFLECT,cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT ,cv2.BORDER_REPLICATE,cv2.BORDER_WRAP

40e523811b522f37b9c0c0b90f39952f.png

cv2.BORDER_REFLECT_101或cv2.BORDER_DEFAULT

♦ 与上面相同,但略有改动,如下所示:gfedcb | abcdefgh | gfedcba

cv.BORDER_REPLICATE

♦ 最后一个像素在整个过程中被复制,像:aaaaaa |abcdefgh|hhhhhhh这样

cv.BORDER_WRAP

♦ 对称方向 像素互换 就像:cdefgh|abcdefgh|abcdefg 这样。

我们来看代码:

import cv2from matplotlib import pyplot as pltBLUE = [255,0,0]img1 = cv2.imread('cat.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()


实验效果:

c8136f1310fde94bdfca90b47d89a00f.png

对于五个参数都进行了实验,可以看到明显的不同,当然,在这里为了方便图片对比显示,我们使用了matplotlib库,不过这属于python的知识,在这里就不一一介绍讲解了,大家也可以修改代码用OpenCV进行其他参数输出。

图像的算术运算

本次教程我们将概述图像的算数运算,众所周知,数学中有着加减乘除运算,同样的,图像也是如此,它的本质实际上就是一个矩阵,所以图像也存在着加法、减法、位运算等等算数运算。

1.加法

使用cv2.add()将两个图像相加,可以使用numpy中的矩阵加法来实现。但是在opencv中加法是饱和操作,也就是有上限值,numpy会对结果取模,综上,使用opencv的效果更好,我们来看函数实例:

cv2.add(img1, img2)  # 进行图片的加和


参数说明:cv2.add将两个图片进行加和,大于255的使用255计数。

我们将使用以下两个图片作为实例:

dfb4a65e77229976f6e22e0febfbaceb.png

ad2c1750cc98b97f0016c36e245de55e.png

来看代码:

import cv2img1 = cv2.imread("01.jpg")img2 = cv2.imread("02.jpg")res = cv2.add(img1,img2)cv2.imshow("res",res)cv2.waitKey(0)cv2.destroyAllWindows()

ec181cf23060985296243a7304555527.png

不难理解,第一幅图像白色部分像素部分为255,黑色部分像素为0,所以和第二幅图像加起来之后白色部分仍然是白色部分,因为加起来的值大于255时,默认取值255。

2.减法

减法运算就是两幅图像见对象像素的灰度值或彩色分量进行相减,它可以用于目标检测,需要用到函数cv2.subtract(),程序实现:

import cv2img1 = cv2.imread("01.jpg")img2 = cv2.imread("02.jpg")res = cv2.subtract(img1,img2)cv2.imshow("res",res)cv2.waitKey(0)cv2.destroyAllWindows()

82b0c59db8a92a3beb46666b59dd5cbd.png

3.乘法

图像的乘法运算就是将两幅图像对应的灰度值或彩色分量进行相乘。

乘运算的主要作用是抑制图像的某些区域,掩膜值置为1,否则置为0。乘运算有时也被用来实现卷积或相关的运算,其相关函数为cv2.multiply()。

以下为相关程序代码:

import cv2img1 = cv2.imread("01.jpg")img2 = cv2.imread("02.jpg")res = cv2.multiply(img1,img2)cv2.imshow("res",res)cv2.waitKey(0)cv2.destroyAllWindows()

073749dffd0bcb344e523e9c03043e2a.png

4.除法

图像除运算就是两幅图像对应像素的灰度值或彩色分量进行相除。简单的出运算可以用于改变图像的灰度级。其相关函数为cv2.divide。

以下为代码部分:

665475fe1aa40549b7fe23d25fc14f5d.png

5.图像融合

它实际上本质也是一个加法运算,但是这个加法运算跟普通的并不一样,我们可以理解为是一种加权的运算。

我们用函数来表示一个图像,前提是所有的图像尺寸是一样的,即图像矩阵的行列一样,通道数一样。

我们用 f0(x) 和 f1(x) 来表示输入的图像,用 g(x) 来表示输出图像,α表示比例( 0≤α≤1 ,一般来说,α取0和1没有太大意义),那我们能得到如下图所示的一个公式:

41e2ae2b88080beb2de03a512c8c53fa.png

所以图像混合就是将两个图像按照一定的比例转存到另一个图像中。

首先需要看一下函数原型:

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst

♦ src1—第一个输入数组。

♦ alpha—第一个数组元素的权重。

♦ src2—第二个输入数组,其大小和通道号与src1相同。

♦ beta—第二个数组元素的权重。

♦ gamma—标量加到每个和。

♦ dst—输出数组,其大小和通道数与输入数组相同。

♦ dtype—输出数组的可选深度;当两个输入数组的深度相同时,可以将dtype设置为-1,这等效于src1.depth()。

此函数可以用以下矩阵表达式进行代替:

dst = src1 * alpha + src2 * beta + gamma;

注意:由参数说明可以看出,被叠加的两幅图像必须是尺寸相同、类型相同的;并且,当输出图像array的深度为CV_32S时,这个函数就不适用了,这时候就会内存溢出或者算出的结果压根不对。

我们来看一下代码:

import cv2img1 = cv2.imread("01.jpg")img = cv2.imread("02.jpg")h, w, _ = img1.shapeimg2 = cv2.resize(img, (w,h), interpolation=cv2.INTER_AREA)alpha = 0.7beta = 1-alphagamma = 0img_add = cv2.addWeighted(img1, alpha, img2, beta, gamma)cv2.imshow('img_add',img_add)cv2.waitKey()cv2.destroyAllWindows()

效果:

2df213ad9bb0eb896d230a753e484f3b.png

此函数最大的缺陷就是需要两张图片尺寸必须完全一样,所以在实验时必须要注意。

6.按位运算

我们在学习数电时想必都学过逻辑运算,OpenCV中也有相关的运算。与或非这些想必就不必再多讲了,我们可以通过代码实验来熟悉:

1)与运算:

import cv2img1 = cv2.imread("01.jpg")img2 = cv2.imread("02.jpg")res = cv2.bitwise_and(img1,img2)cv2.imshow("res",res)cv2.waitKey()cv2.destroyAllWindows()

582876f1973f7c6a154e62cf6ae36eed.png

2)或运算:

import cv2img1 = cv2.imread("01.jpg")img2 = cv2.imread("02.jpg")res = cv2.bitwise_or(img1,img2)cv2.imshow("res",res)cv2.waitKey()cv2.destroyAllWindows()

4ad38d691a046e94e0738af53d2bd89f.png

可以看到,跟加法运算基本上类似。

3)非运算:

import cv2img1 = cv2.imread("01.jpg")img2 = cv2.imread("02.jpg")res = cv2.bitwise_not(img1,img2)cv2.imshow("res",res)cv2.waitKey()cv2.destroyAllWindows()

98379266819705493420ffac0296c42e.png

非运算在之后的学习中是非常有帮助的,它的以用来对二值化图像进行取反,然后方便进行形态学操作。

4)异或运算:

import cv2img1 = cv2.imread("01.jpg")img2 = cv2.imread("02.jpg")res = cv2.bitwise_xor(img1,img2)cv2.imshow("res",res)cv2.waitKey()cv2.destroyAllWindows()

53e6774c86da5466f8587927c7ca2a0f.png

关于图像的所有的基本运算就介绍到这里。

7.练习实例

现在带大家做一个好玩的小项目,题目是:用OpenCV完成一个幻灯片演示一幅图转成另一幅图,并在图像之间进行平滑过渡。

实际上,我们使用刚刚的线性加权函数就可以完成,我们只需要定义一个变量a,然后让其值小于一,变量的值依次递增。这样总体进行分析的话,第一幅图图像的加权值为a,第二幅图像的加权值为1-a,那么在一个循环里面它们会进行动态过渡,我们来看一下代码:

import cv2 as cvimg1 = cv.imread('01.jpg')img2 = cv.imread('02.jpg')l, h = img1.shape[0:2]img2_R = cv.resize(img2, (h, l))a=0cv.namedWindow('ppt',True)dst = cv.addWeighted(img1, a, img2_R, 1-a, -1)cv.imshow('ppt', dst)cv.waitKey(0)while a<1.0:dst = cv.addWeighted(img1, a, img2_R, 1-a, -1)cv.imshow('ppt', dst)cv.waitKey(100)a+=0.02cv.waitKey(0)cv.destroyAllWindows()

ec0477e1d3126540895b5ca06fddf02b.png

按下esc键开始幻灯片放映,由于效果为动态,此处不便展示,大家请自己实验,还是很有意思的。

2df122ee293bc632e499cd63b2ec12b6.gif2446d4a8e64fb3bd982014d098dcf5a4.png扫码入群扫码添加管理员微信

加入“电子产品世界”粉丝交流群

↓↓↓↓点击,查看更多新闻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光伏领跑者火热前行 可靠性护航“长跑”

随着第三批光伏领跑者申报标准的出台&#xff0c;在目前普通电站指标有可能缩水的情况下&#xff0c;2017年8-10GW的光伏领跑者项目又将成为各电站投资商争夺的“红海”。光伏领跑者在过去两年时间里为行业带来的变化有目共睹&#xff0c;从模式创新到电价下降&#xff0c;快速…

鸿蒙os系统被推送,鸿蒙来了!华为大规模推送鸿蒙OS系统,造成网站一度瘫痪...

千呼万唤始出来&#xff0c;期盼已久的手机鸿蒙OS系统终于迎来了大规模推送&#xff01;今年2月份在华为Mate X2折叠屏手机发布会上&#xff0c;华为就曾表示将在4月份开始大规模推送鸿蒙OS系统&#xff0c;4月27日通过测试申请的用户正式接到升级鸿蒙OS系统的通知&#xff0c;…

jps、jinfo、jstat、jstack、jmap、jconsole等命令简介

2019独角兽企业重金招聘Python工程师标准>>> JDK提供了几个很实用的工具&#xff0c;如下&#xff1a; jinfo&#xff1a;观察运行中的java程序的运行环境参数&#xff1a;参数包括Java System属性和JVM命令行参数&#xff0c;java class path等信息。命令格式&…

读《底层逻辑》

《底层逻辑》本书作者是刘润&#xff0c;他在得到上开设了课程《5 分钟商学院》&#xff0c;我也是在得到上知道的这本书&#xff0c;这本书在豆瓣上的评分不是很高&#xff0c;褒贬不一&#xff0c;不过我看着觉得挺好。看了一些豆瓣的评论&#xff0c;觉得这本书不好有这么几…

2016年:勒索病毒造成损失预估超过10亿美元

根据趋势科技公布的最新报告&#xff08;PDF&#xff09;&#xff0c;2016年是敲诈勒索软件频发的一年&#xff0c;同比增长752%&#xff0c;预测由Locky、Goldeneye等勒索病毒所造成的损失超过10亿美元。报告中同时指出企业和个人是勒索软件的重灾区&#xff0c;而且勒索病毒还…

python3.6字典有序_为什么从Python 3.6开始字典有序并效率更高

在Python 3.5&#xff08;含&#xff09;以前&#xff0c;字典是不能保证顺序的&#xff0c;键值对A先插入字典&#xff0c;键值对B后插入字典&#xff0c;但是当你打印字典的Keys列表时&#xff0c;你会发现B可能在A的前面。 但是从Python 3.6开始&#xff0c;字典是变成有顺序…

Linux的进程/线程间通信方式总结

2019独角兽企业重金招聘Python工程师标准>>> Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式&#xff1a;包括信号量(Semaphore), 消息队列(Me…

开源作者去世后,代码谁来继承?

文 | 肖滢出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013)2008 年初&#xff0c;澳大利亚一对兄弟 Simon Zerner 和 Toby Zerner 开始了 esoTalk 的开发。不幸的是&#xff0c; esoTalk 尚处于 Alpha 阶段&#xff0c;主力开发人员哥哥 Simon 就在 2009 年年中去世。…

项目中使用CLR编程

1、创建自己的项目 2、右键“解决方案。。。”→添加→新建项目→C#→数据库→SQL Server项目,如下图所示: 3、选择操作数据库

SDN火爆!未来五年年复合增长率达98%

在如今的网络世界&#xff0c;软件定义网络SDN和网络功能虚拟化NFV成为了新的“宠儿”&#xff0c;特别是对于运营商来说&#xff0c;已经将它们视为面向未来转型的关键。因此已经有越来越多的运营商开始尝试引入SDN和NFV技术&#xff0c;尽管它们的标准还尚未完善。 最早采用S…

python桌面程序开发_程序员之路:python3+PyQt5+pycharm桌面GUI开发

先看效果&#xff1a;图 1 没错&#xff0c;学过C#的同学应该很熟悉这个界面&#xff0c;按钮风格和界面风格很相似&#xff0c;万万没想到&#xff0c;python也可以做出这样的界面&#xff0c;简直了&#xff01;&#xff08;图 1&#xff09; 正文开始 一、安装python 为啥要…

转: MySQL 赋予用户权限(grant %-远程和localhost-本地区别)

2019独角兽企业重金招聘Python工程师标准>>> ‍‍相关参考资料&#xff1a;MySQL 赋予用户权限命令的简单格式可概括为&#xff1a;grant 权限 on 数据库对象 to 用户一、grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。 grant s…

kafka控制台模拟消费_Kafka 详解

kafka简介Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需…

python在web可以开发吗_Python Web开发

参考原文 WSGI接口 WSGI&#xff08;Web Server Gateway Interface&#xff09;是一个接口&#xff0c;用来屏蔽底部的细节&#xff08;如TCP的建立连接&#xff0c;HTTP原始请求和响应格式等&#xff09;。WSGI接口定义非常简单&#xff0c;只需要Web开发者实现一个函数&#…

更新丨.NET 7 预览版2 中的 ASP.NET Core

点击上方蓝字 关注我们&#xff08;本文阅读时间&#xff1a;6分钟).NET 7 预览版2 现已推出&#xff0c;其中包括对 ASP.NET Core 的许多重大改进。以下是此预览版中新增内容的摘要&#xff1a;• 推断来自服务的 API 控制器操作参数&#xff1b;• SignalR 集线器方法的依赖注…

LoadRunner+Android模所器实现抓包并调试本地服务端

为了测试Android软件的服务端的功能&#xff0c;需要重现某些客户端操作&#xff0c;便于发现功能问题&#xff0c;性能问题。也方便客户端与本机服务端特别是服务端代码进行断点调试。这个时候需要对网络操作进行重现。loadRunner是hp公司开发的压力测试工具。功能比较强大&am…

架构师

系统架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的人。具体来说是一个确认和评估系统需求&#xff0c;给出开发规范&#xff0c;搭建系统实现的核心构架&#xff0c;并澄清技术细节、扫清主要难点的技术人员。主要着眼于系统的“技术实现”…

统信uos系统考试题_148款!富士通及旗下晟拓品牌系列打印机适配统信UOS

近日&#xff0c;南京富士通电子信息科技股份有限公司(简称&#xff1a;富士通)及其旗下晟拓子品牌148款主流打印机产品与统信桌面操作系统UOS的适配工作即将完成&#xff0c;这次适配涵盖了富士通及晟拓的常用主流机型。富士通正式成为统信软件产品生态合作伙伴。本次适配&…

手机浏览器html5游戏,移动浏览器都爱 HTML5 ?

目前中国第三方手机浏览器市场竞争正在愈演愈烈&#xff0c;但由于各应用开发商对手机浏览器的内容和资源的整合能力、技术研发能力、战略布局目的等方面均各不相同&#xff0c;浏览器产品也出现了同质化严重、内容匮乏等问题&#xff0c;亮点突出、吸引用户的产品较缺乏&#…

怎么快速了解自己的MySQL服务器?

From: http://www.cnblogs.com/benshan/archive/2013/01/09/2853097.html 1、查看数据库服务器状态&#xff1a;status Linux 下的MySQL服务器状态 该列表中主要包括MySQL的版本&#xff08;为version 5.1.61&#xff09;、运行平台&#xff08;debian-linux-gnu(i686)&#xf…