图像处理基本概念

2015-11-09 11:45:43 qq_20678703 阅读数 0
  • 数据库的基本概念

    1、MySQL的完整学习路径和底层运行机制 2、掌握发挥MySQL的最佳性能的优化方法 3、掌握如何处理海量业务数据和高并发请求 4、增加工作和面试时的竞争力

    27328课时 0分钟 12528人学习 刘运强
    免费试看

转载来自:http://blog.csdn.net/mr_raptor/article/details/30113417


4.3定制Android平台系统

通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品,从本节开始,我们从最原始的Android源码系统里一步一步定制出自己的Android系统。本节主要内容包含:根据Android源码,添加新产品编译项,定制系统启动界面和文字,定制系统启动动画和声音,定制系统桌面。

4.3.1 添加新产品编译项

Android系统的源代码是一个逻辑结构非常独立工程,在一套Android源码中可以编译出多个产品映像,在需要编译某一个产品系统时,只要通过lunch命令选择产品编译项即可。本节我们介绍如何在Android源码中创建新产品编译项并定制编译出该产品系统。

在创建新产品编译项时,要先了解下面几个概念:

Ø 目标产品:具体指某个最终用户买到的Android设备,如:iPhone5,乐PhoneS2,小米手机等。

Ø 产品系列:开发手机的团队通常由同一团队打造,在研发出一款产品后,往往要继续在其基础上研发出新产品,新产品往往是在老产品的硬件或软件基础上做一些升级,这些产品们就是一个产品系列。比如:联想的乐Phone系列手机包含:乐PhoneS1和乐PhoneS2,他们同属于一个系列。

Ø 目标设备:目标设备可以理解为手机主板,它是指手机设备硬件配置信息的集合体,每个手机产品都有设备硬件配置,一个设备硬件配置可能被不同产品使用,同一手机有高配置版本和低配置版本,如乐PhoneS2有512M RAM、8G Flash容量版本和1G RAM 、16G Flash容量版本。

在Android编译系统中,每个编译项编译出一个产品系统,每个目标产品都对应一个目标设备,一个产品系列包含多个不同的产品,一个目标设备可能被多个产品配置使用。

由前面描述可知,同一系列的新老产品之间可以存在“继承关系”,新产品是老产品的“子产品”,老产品是新产品的“父产品”,子产品可以复用父产品的特性,还可以重写、扩展父产品。如:老产品不支持NFC近距离通信技术,新产品支持NFC技术。同样,设备主板间也存在“继承关系”。

 

图x-x 产品、设备与编译项关系图

 

如图x-x所示,某一产品系列包含3个产品,2个目标设备,其中产品2继承了产品1,产品2 使用了设备2,它是基于产品1所使用的设备1的升级。产品3使用了和产品2一样的设备2,他们硬件配置一样,但是却不是同一产品,3个不同产品都对应一个产品编译项。

在Android编译系统中,产品编译项相关配置文件都在device/<厂商名>/目录下。厂商的产品列表由AndroidProducts.mk文件定义,目标产品信息由<产品名>.mk定义,目标设备信息由BoardConfig.mk和AndroidBoard.mk定义。创建新产品的编译项就是创建上述几个mk文件的过程。

1.      创建厂商目录

不同的手机厂商对应device/下不同目录,在厂商目录下放置该厂商的产品相关信息,我们厂商名定义为mycompany。

$ cd ~/android/android_source

$ mkdir device/mycompany

2.      在厂商目录下创建设备目录

定义设备名为myphone。

$ mkdir device/mycompany/myphone

3.      添加新产品编译项配置文件,该配置文件在执行source build/envsetup.sh时,被加载执行

$ vim device/mycompany/myphone/vendorsetup.sh

在vendorsetup.sh文件时添加下面一条命令,用于向编译系统添加编译项,新添加的产品名为:myproduct,编译类型为eng。

add_lunch_combo myproduct-eng

注:add_lunch_combo命令是build/envsetup.sh脚本中定义的函数,表示将一个新产品编译项添加到lunch菜单里。

4.      创建产品列表配置文件AndroidProducts.mk

AndroidProducts.mk文件用于定义当前厂商所拥有的所有产品列表,每个产品都对应一个配置文件:

$ vimdevice/mycompany/myphone/AndroidProducts.mk

在产品列表配置文件中添加如下内容:

PRODUCT_MAKEFILES := \

   $(LOCAL_DIR)/full_product.mk

注:PRODUCT_MAKEFILES变量用于保存所有产品配置信息列表,$(LOCAL_DIR)表示当前目录,full_product.mk表示某一款产品的配置文件。

5.      配置full_product.mk文件,定义产品的配置信息,添加如下内容:

include build/target/product/languages_full.mk

include build/target/product/full.mk

 

# Discard inherited values and use our owninstead.

PRODUCT_NAME := myproduct

PRODUCT_DEVICE := myphone

产品配置也可以和Java中的类一样被继承,通过inclulde命令可以将指定的文件包含进来,然后在后面可以对里面的内容进行重写。一般而言不同的产品产品名和设备名都不一样,在full_product.mk中对继承的full.mk中的产品名和设备名进行重写:PRODUCT_NAME为myproduct,PRODUCT_DEVICE为myphone。

在full_product.mk文件中继承的languages_full.mk内容如下:

@build/target/product/languages_full.mk

PRODUCT_LOCALES := en_US fr_FR it_IT es_ES de_DEnl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TRpt_PT pt_BR rm_CH sv_SE bg_BG ca_ES en_GB fi_FI hr_HR hu_HU in_ID iw_IL lt_LTlv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH

该配置文件里表示的是当前产品系统里默认支持的本地语言,由上述配置信息可知,它基本包含了Android所支持的所有语言包。

@build/target/product/full.mk

PRODUCT_PACKAGES := \

   OpenWnn \

   PinyinIME \

    VoiceDialer\

   libWnnEngDic \

   libWnnJpnDic \

   libwnndict

 

# Additional settings used in all AOSP builds

PRODUCT_PROPERTY_OVERRIDES := \

   keyguard.no_require_sim=true \

   ro.com.android.dateformat=MM-dd-yyyy \

   ro.com.android.dataroaming=true \

   ro.ril.hsxpa=1 \

   ro.ril.gprsclass=10

 

PRODUCT_COPY_FILES := \

   development/data/etc/apns-conf.xml:system/etc/apns-conf.xml \

   development/data/etc/vold.conf:system/etc/vold.conf

 

# Pick up some sounds - stick with the shortlist to save space

# on smaller devices.

$(call inherit-product,frameworks/base/data/sounds/OriginalAudio.mk)

 

# Get the TTS language packs

$(call inherit-product-if-exists,external/svox/pico/lang/all_pico_languages.mk)

 

# Get a list of languages. We use the small listto save space

# on smaller devices.

$(call inherit-product,build/target/product/languages_small.mk)

 

$(call inherit-product,build/target/product/generic.mk)

 

# Overrides

PRODUCT_NAME := full

PRODUCT_BRAND := generic

PRODUCT_DEVICE := generic

PRODUCT_MODEL := Full Android

继承的full.mk文件内容比较多,我们将主要的一些变量列出如表x-x所示。

变量名

作用

使用方式

PRODUCT_PACKAGES

系统预置的模块列表,不仅仅只是Android应用程序,还可以包含库,可执行程序等

直接将系统中要安装的模块名以空格隔开列出

PRODUCT_PROPERTY_OVERRIDES

系统设置的属性值

将所有预设的属性以空格隔开列出,属性格式为:key-value

PRODUCT_COPY_FILES

要拷贝的文件

将文件列表拷贝到文件系统中,文件格式为:源文件:目标文件

PRODUCT_NAME

产品名

该产品名要和编译项中产品名一致

PRODUCT_BRAND

产品品牌

 

PRODUCT_DEVICE

产品对应的设备名

该名字要和产品设备主板配置文件(BoardConfig.mk)所在目录名一致

PRODUCT_MODEL

 

 

总结:我们自己定义的full_product产品继承了build/target/product/目录下的full.mk和languages_full.mk,full.mk文件是Android系统定义的一个“通用产品”,languages_full.mk文件是全部语言包配置文件,这样,自己的产品full_product就具有了通用产品的特点并且支持全部语言包。

6.      定义目标产品对应的设备配置文件AndroidBoard.mk和BoardConfig.mk

同样的道理,我们可以继承使用通用设备配置文件:build/target/board/generic/目录下的AndroidBoard.mk和BoardConfig.mk文件。

Ø 创建AndroidBoard.mk和BoardConfig.mk文件

$ touch AndroidBoard.mk BoardConfig.mk

Ø 添加AndoridBoard.mk的内容如下:

@ device/mycompany/myphone/AndroidBoard.mk

include build/target/board/generic/AndroidBoard.mk

“继承”的父AndroidBoard.mk,其内容:

@build/target/board/generic/AndroidBoard.mk

LOCAL_PATH := $(call my-dir)

 

file := $(TARGET_OUT_KEYLAYOUT)/tuttle2.kl           # Linux内核按键码布局文件

ALL_PREBUILT += $(file)

$(file) : $(LOCAL_PATH)/tuttle2.kl | $(ACP)

         $(transform-prebuilt-to-target)

 

include $(CLEAR_VARS)

LOCAL_SRC_FILES := tuttle2.kcm            # Android按键码映射文件

include $(BUILD_KEY_CHAR_MAP)

其实build/target/board/generic/AndroidBoard.mk文件里只是拷贝了按键映射文件和默认系统属性文件,我们可以将其内容直接拷贝到device/mycompany/myphone/AndroidBoard.mk中。

Ø 添加BoardConfig.mk的内容如下:

@ device/mycompany/myphone/BoardConfig.mk

includebuild/target/board/generic/BoardConfig.mk

“继承”的父BoardConfig.mk内容:

@build/target/board/generic/BoardConfig.mk

# config.mk

#

# Product-specific compile-time definitions.

#

 

# The generic product target doesn't have anyhardware-specific pieces.

TARGET_NO_BOOTLOADER := true                  # 当前设备是否没有Bootloader

TARGET_NO_KERNEL := true                            # 当前设备是否没有Linux内核

TARGET_CPU_ABI := armeabi                           # 当前设备支持的目标架构

HAVE_HTC_AUDIO_DRIVER := true                   # 是否使用HTC的音频驱动

BOARD_USES_GENERIC_AUDIO := true          # 是否使用通用音频技术

 

# no hardware camera

USE_CAMERA_STUB := true                    # 是否使用摄像头Stub

通过BoardConfig.mk的信息可知,其实该文件就是定义了一些设备硬件相关的一些变量,这些变量用来裁剪系统的功能,决定Android系统可运行的体系构架。

7.      根据需要定义产品默认属性和键值信息

Android系统的属性服务类似于Windows的注册表,记录着系统的一些设置信息,我们可以在新产品中预定义一些属性值来设置自己产品。在Android编译系统中,属性都保存在xxx.prop文件中,在build/target/board/generic/system.prop中定义了默认的属性,我们可以在它基础上进行修改。

复制属性文件:

$ cp build/target/board/generic/system.prop  device/mycompany/myphone/

在Android系统中,底层使用Linux内核来接收来自按键硬件上报的键值信息,上层处理用户按键的是Android的框架,二者之间通过两个键值布局文件来进行键值的映射。

Ø Keylayout文件:按键布局文件,以kl后缀命名,该文件用来定义按键驱动里上报的键值号(数字)和Linux内核中通过event事件上报的键值(字符)之间的映射关系。kl文件要放在/system/usr/keylayout/目录下或/data/usr/keylayout/目录下。

Ø KeyCharMap文件:键值字符映射文件,以kcm后缀命名,它用来将Linux内核上报来的键值(字符)进行转换,转换成Android系统里可以识别的键盘码或组合按键。kcm文件要放在/system/usr/keychars/目录下或/data/usr/keychars/目录下。

上述两个按键映射文件使用按键驱动名作为其文件名,如果没有驱动名对应的布局文件,则使用/system/usr/keylayout/qwerty.kl和/system/usr/keychars/qwerty.kcm作为默认的按键映射文件。这两个文件名都通过AndroidBoard.mk文件负责拷贝和安装。

如果我们要使用模拟器作为目标设备,只需要将源码build/target/board/generic/目录里的tuttole2.kl和tuttle2.kcm拷贝到AndroidBoard.mk所在的目录中即可。

$ cp build/target/board/generic/tuttle2.kl  device/mycompany/myphone/tuttle2.kl

$ cp build/target/board/generic/tuttle2.kcm  device/mycompany/myphone/tuttle2.kcm 

如果想要自定义系统的物理按键与Android系统的按键映射关系,则需要在tuttle2.kl和tuttle2.kcm的基础上进行修改,然后再修改AndroidBoard.mk的内容:

$ cp build/target/board/generic/tuttle2.kl  device/mycompany/myphone/<按键驱动名>.kl

$ cp build/target/board/generic/tuttle2.kcm  device/mycompany/myphone/<按键驱动名>.kcm 

修改device/mycompany/myphone/AndroidBoard.mk文件:

LOCAL_PATH := $(call my-dir)

 

file := $(TARGET_OUT_KEYLAYOUT)/<按键驱动名>.kl           # Linux内核按键码布局文件

ALL_PREBUILT += $(file)

$(file) : $(LOCAL_PATH)/<按键驱动名>.kl | $(ACP)

         $(transform-prebuilt-to-target)

 

include $(CLEAR_VARS)

LOCAL_SRC_FILES := <按键驱动名>.kcm                  #  Android按键码映射文件

include $(BUILD_KEY_CHAR_MAP)

注:kcm文件最终被编译系统的key_char_map.mk编译成xxx.kcm.bin的二进制形式,这是因为每个Android应用程序都要加载该按键映射文件,为了加快读取速度刻意而为之的。

创建新产品编译项时创建的目录与文件结构如下:

device/mycompany/                          # 厂商目录

└── vendorsetup.sh           # 添加编译项命令文件

└── myphone/                    # 设备名目录

├── AndroidBoard.mk                  # 设备属性和键值映射配置文件

├── AndroidProducts.mk             # 产品列表文件

├── BoardConfig.mk          # 设备硬件配置及目标架构配置文件

├── full_product.mk            # 目标产品配置文件

├── system.prop                          # 系统默认属性配置文件

├── tuttle2.kcm                            # Android系统键值映射文件

├── tuttle2.kl                      # Linux内核按键布局文件

确认上述目录和文件创建没有问题了,执行Android编译步骤:sourcebuild/envsetup.sh,lunch选择myproduct-eng编译项。

如果看到如下信息,说明我们已经添加新产品成功。

============================================

PLATFORM_VERSION_CODENAME=REL

PLATFORM_VERSION=2.3.6

TARGET_PRODUCT=myproduct

TARGET_BUILD_VARIANT=eng

TARGET_SIMULATOR=false

TARGET_BUILD_TYPE=release

TARGET_BUILD_APPS=

TARGET_ARCH=arm

HOST_ARCH=x86

HOST_OS=linux

HOST_BUILD_TYPE=release

BUILD_ID=GRK39F

============================================

8.      常见问题

Ø 问题1: lunch菜单里没有出现myproduct编译项

原因及解决方法:在执行lunch之前,要执行source build/envsetup.sh命令,确认vendorsetup.sh文件存在及其内容正确无误。

Ø 问题2:选择完lunch菜单里的编译项后,出错:

*** No matches for product"myproduct".  Stop.

** Don't have a product spec for:'myproduct'

** Do you have the right repo manifest?

原因及解决方法:编译系统找不到用户选择的编译项里的myproduct产品,确认AndroidProducts.mk文件里列出了myproduct产品的配置文件full_product.mk,并且full_product.mk文件中PRODUCT_NAME变量的值为产品名:myproduct

Ø 问题3:选择完lunch菜单里的编译项后,出错:

*** No config file found for TARGET_DEVICEmyphone.  Stop.

** Don't have a product spec for:'myproduct'

** Do you have the right repo manifest?

原因及解决方法:编译系统找不到myproduct产品对应的设备myphone,确认myproduct产品的配置文件full_product.mk中PRODUCT_DEVICE变量的值为产品名:myphone,并且在device/mycompany/目录下创建了myphone的设备目录,在该目录下存在BoardConfig.mk文件。

4.3.2 定制产品的意义及定制要点

Android系统是一个完全开源的系统,我们可以通过修改Linux内核代码和Android源码,定制具有独特创意的产品系统,对于产品同质化非常严重的移动市场, Android系统的细节个性化定制也可以让用户眼前一亮。另外,一些产品明确要求要修改或增加一些个性化,如:默认的Android系统开机界面是一个黄嘴的小企鹅,在Android系统启动过程中是一个ANDROID字样的动画效果,厂商一般都要求自己产品开机界面是厂商Logo,开机动画是一个能动态、鲜明表现公司活力的动画效果,我们从本节开始介绍定制产品系统的实现技术。

在整个开机过程中,屏幕上会出现三次内容,如图x-x 所示:

Ø  Linux启动时画面,通常是个黄嘴的小企鹅

Ø  Android系统init进程启动阶段画面,是“ANDROID”文字字样

Ø  Android系统启动阶段动画,是滚动的ANDROID动画


图 x-x 开机界面与Android动画

定制系统开机动画

【实验背景知识】

Android的开机动画是由Linux本地守护程序bootanimation专门控制实现的,其代码在:frameworks/base/cmds/bootanimation/目录下,修改Android开机动画有两种方式:

Ø 蒙板图片替换:

替换frameworks/base/core/res/assets/images/目录下的两个图片文件:android-logo-mask.png和android-logo-shine.png。android-logo-mask.png是镂空蒙板图片,android-logo-shine.png是镂空蒙板后面的闪光png图片。两个图片通过叠加移动来达到动画效果。

Ø 逐帧动画替换:

在/data/local/或/system/media/目录创建bootanimation.zip文件,该压缩包文件里存放有逐帧动画及控制脚本。

【实验组成】

本实验分为两部分:蒙板图片替换实验和逐帧动画替换实验。

【实验内容】

分析Android系统的两种开机动画实现方式,制作并替换开机动画,最终在Android模拟器中运行定制开机动画的系统。

【实验目的】

通过实验,了解Android系统的两种开机动画实现方式,掌握如何定制产品的开机动画,并在Android模拟器中,运行定制开机动画的Android系统。

【实验平台】

拥有Android源码编译环境的Ubuntu操作系统(可以在Windows系统中虚拟Ubuntu系统)。

【蒙板图片替换实验步骤】

1.       使用PhotoShop等图像处理软件制作一张背景为黑色,中间镂空的png格式的图片,命名为:android-logo-mask.png,如图x-x所示。


图x-x 制作镂空动画

2.      将android-logo-mask.png拷贝到frameworks/base/core/res/assets/images/目录下替换Android默认的图片,为了防止源码不编译图片资源,将图片时间戳更新一下。

$ cp android-logo-mask.png    ~/android/android_source/frameworks/base/core/res/assets/images/

$ touch ~/android/android_source/frameworks/base/core/res/assets/images/android-logo-mask.png

3.      重新编译Android的系统资源包framework-res.apk

$ source build/envsetup.sh

$ lunch generic-eng

$ mmm frameworks/base/core/res/

4.      生成新的system.img

$ make snod

5.      启动Android模拟器,实验效果如图x-x所示。

$ ./run_emulator.sh

 

图x-x 定制开机动画效果

 

 

【逐帧动画替换实验步骤】

1.      在/data/local/或/system/media/目录创建bootanimation.zip文件

如果放在/data/local目录下,不需要编译Android源码,直接通过adb命令或文件管理软件拷贝到目录下即可,如果集成进Android系统中,则需要放在/system/media/目录下,这时要重新编译生成system.img映像。

bootanimation.zip文件是直接由几个文件打包生成的,打包的格式是ZIP,打包时的压缩方式选择为存储。


图x-x 压缩文件方式

 

bootanimation.zip文件打包前的结构为:

表x-x bootanimation.zip压缩包文件结构

文件

说明

desc.txt

动画属性描述文件

part0/

第一阶段动画图片的目录

part1/

第二阶段动画图片的目录

其中part0和part1中的动画图片类似于电影胶片,两张图片之间变化较小,他们以固定的速度显示,从而产生动画效果,图片的大小和图片显示的时间控制由desc.txt文件说明。

desc.txt文件内容为:

480 250 15

p 1 0 part0

p 0 10 part1

desc.txt文件的格式为:

 

数据及说明

图片属性

320(图片宽)

320(图片高)

15(每秒显示帧数)

第一阶段动画属性

P(默写标志符)

1(循环次数为1 )

0(进入该阶段的间隔时间)

part0(该阶段图片存放目录)

第二阶段动画属性

p(默写标志符)

0(无限循环)

10(进入该阶段的间隔时间)

part1(该阶段图片存放目录)

注:

标识符:p 是必须的。

循环次数:指该目录中图片循环显示的次数,0表示本阶段无限循环。

每秒显示帧数:就是每秒显示的图片数量,决定每张图片显示的时间。

阶段切换间隔时间:指的是该阶段结束后间隔多长时间显示下一阶段的图片,其单位是每张图片显示的时间。

对应图片目录:就是该阶段动画的系列图片,以图片文件目录的顺序显示动画,而且图片的格式必须要为PNG。

由于逐帧动画不太方便制做,我们直接使用光盘中:章节实验/第四章定制系统开机动画/bootanimation.zip文件作为演示。

2.      如果bootanimation.zip放到/system/media/目录下,则重新编译生成system.img

$ source build/envsetup.sh

$ lunch generic-eng

$ make snod

3.      启动Android模拟器,查看动画效果,如图x-x和x-x所示。

$ ./run_emulator.sh

 

图x-x 第一阶段开机动画

 

图x-x 第二阶段开机动画

结论:通过实验看出,当我们使用逐帧动画时,蒙板动画就不播放了,这是因为Android系统只能使用一种启动动画方式,先判断是否使用了逐帧动画,如果没有使用逐帧动画时,才使用默认的蒙板动画。



2018-07-07 19:55:07 shengTW 阅读数 898
  • 数据库的基本概念

    1、MySQL的完整学习路径和底层运行机制 2、掌握发挥MySQL的最佳性能的优化方法 3、掌握如何处理海量业务数据和高并发请求 4、增加工作和面试时的竞争力

    27328课时 0分钟 12528人学习 刘运强
    免费试看

本文总结一下数字图像处理基本概念,主要来源:《数字图像处理》第三版第二章        

数字图像处理:利用计算机系统对数字图像进行各种目的的处理

数字图像:二维数字组形式表示的图像

像素:由一个数字序列表示的图像中的一个最小单位。可以理解为一个二维数组的一个元素,其值大小表示灰度(强度)

灰度:灰度是表明图像明暗的数值,即黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像。灰度值指的是单个像素点的亮度。灰度值越大表示越亮。

动态范围:系统中最大可度量灰度与最小可检测灰度之比。上限取决于饱和度,下限取决于噪声。

对比度:一幅图像中最高和最低灰度级间的灰度差。高动态范围意味着高对比度。

灰度级:灰度级表明图像中不同灰度的最大数量。灰度级越大,图像的亮度范围越大。

图像/空间分辨率:单位距离可分辨的最大线对数量/像素数。

灰度分辨率:灰度级中可分辨的最小变化。通常说一副被量化为256级的图像有8比特的灰度分辨率。

屏幕分辨率:屏幕分辨率是屏幕每行的像素点数*每列的像素点数,每个屏幕有自己的分辨率。屏幕分辨率越高,所呈现的色彩越多,清晰度越高。

图像所需要的位数b:      b=MxNxK      MxN是空间分辨率 ;K灰度分辨率,单位是bit

                                    存储1幅32 x 32,16个灰度级(灰度分辨率为4bit)的图需要 4,096 bit                                                                                  存储1幅512 x 512,256个灰度级的图需要 2,097,152 bit 

2018-05-18 15:25:39 M_Z_G_Y 阅读数 4553
  • 数据库的基本概念

    1、MySQL的完整学习路径和底层运行机制 2、掌握发挥MySQL的最佳性能的优化方法 3、掌握如何处理海量业务数据和高并发请求 4、增加工作和面试时的竞争力

    27328课时 0分钟 12528人学习 刘运强
    免费试看

数字图像:每一个数字图像都是一个像素点矩阵,这个矩阵包含所有像素点的强度值

 

像素点:最小的图像单元,一张图像由好多的像素点组成。像素就是图像的尺寸

 

位图:也称点阵图,它是由许多点组成的,这些点称为像素。当许多不同颜色的点组合在一起后,便构成了一副完整的图像。 位图可以记录每一个点的数据信息,从而精确地制作色彩和色调变化丰富的图像。但是,由于位图图像与分辨率有关,它所包含的图像像素数目是一定的,若将图像放大到一定程度后,图像就会失真,边缘出现锯齿。

 

灰度:表示图像像素明暗程度的数值,也就是黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0。灰度值指的是单个像素点的亮度,灰度值越大表示越亮。灰度级表明图像中不同灰度的最大数量灰度级越大,图像的亮度范围越大。

 

 

通道:把图像分解成一个或多个颜色成分;①单通道:一个像素点只需一个数值表示,只能表示灰度,0为黑色; ②三通道:RGB模式,把图像分为红绿蓝三个通道,可以表示彩色,全0表示黑色;③四通道:在RGB基础上加上alpha通道,表示透明度,alpha=0表示全透明

 

深度:深度即位数(比特数)①位深:一个像素点所占的总位数,也叫像素深度、图像深度等,其中位深 = 通道数 × 每个通道所占位数  ②256色图:n位的像素点可以表示2^n种颜色,称2^n色图,n=8时为256色图 ③8位RGB与8位图:前者的位数指每个通道所占的位数,后者指整个像素点共占的位数,其中8位RGB是一个24位图,也称为真彩

 

对比度:指不同颜色之间的差别。对比度越大,不同颜色之间的反差越大,即所谓黑白分明,对比度过大,图像就会显得很刺眼。对比度越小,不同颜色之间的反差就越小。对比度=最大灰度值/最小灰度值

 

亮度:指照射在景物或图像上光线的明暗程度。图像亮度增加时,就会显得耀眼或刺眼,亮度越小时,图像就会显得灰暗。

 

色相:颜色,调整色相就是调整景物的颜色,例如,彩虹由红、橙、黄、绿、青、蓝、紫七色组成,那么它就有七种色相。顾名思义即各类色彩的相貌称谓,如大红、普蓝、柠檬黄等。色相是色彩的首要特征,是区别各种不同色彩的最准确的标准。事实上任何黑白灰以外的颜色都有色相的属性,而色相也就是由原色、间色和复色来构成的

 

色调:各种图像色彩模式下原色的明暗程度,级别范围从0到255,共256级色调。例如对灰度图像,当色调级别为255时,就是白色,当级别为0时,就是黑色,中间是各种程度不同的灰色。在RGB模式中,色调代表红、绿、蓝三种原色的明暗程度,对绿色就有淡绿、浅绿、深绿等不同的色调。

色调是指色彩外观的基本倾向。在明度、纯度、色相这三个要素中,某种因素起主导作有用,可以称之为某种色调

 

饱和度:指图像颜色的浓度。饱和度越高,颜色越饱满,即所谓的青翠欲滴的感觉。饱和度越低,颜色就会显得越陈旧、惨淡,饱和度为0时,图像就为灰度图像。可以通过调整电视机的饱和度来进一步理解饱和度的概念。

 

频率:灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。低频就是颜色缓慢地变化,也就是灰度缓慢地变化,就代表着那是连续渐变的一块区域,这部分就是低频。 高频就是频率变化快,即相邻区域之间灰度相差很大,这就是变化得快。图像中,一个影像与背景的边缘部位的频率高,即高频显示图像边缘。图像的细节处也是属于灰度值急剧变化的区域,正是因为灰度值的急剧变化,才会出现细节。另外噪声(即噪点)也是这样,在一个像素所在的位置,之所以是噪点,就是因为它与正常的点颜色不一样了,灰度有了快速地变化。固有“图像的低频是轮廓,高频是噪声和细节”。

 

空域:也叫空间域,即所说的像素域,在空域的处理就是在像素级的处理,如在像素级的图像叠加。通过傅立叶变换后,得到的是图像的频谱。表示图像的能量梯度。

 

频域: 也叫频率域,任何一个波形都可以分解成多个正弦波之和。每个正弦波都有自己的频率和振幅。所以任意一个波形信号有自己的频率和振幅的集合。频率域就是空间域经过傅立叶变换的信号

 

图像分辨率:每英寸图像内的像素点数。分辨率越高,像素的点密度越高,图像越逼真。

 

空间分辨率:图像中可辨别的最小细节的度量,如果一幅图像的尺寸为MxN,表明在成像时采集了MxN个样本,空间分辨率是MxN。

 

灰度分辨率:在灰度级中可分辨的最小变化,在数字图像处理教程中,灰度分辨率指的是色阶,色阶是表示图像亮度强弱的指数标准,也就是我们说的色彩指数。灰度分辨率指亮度,和颜色无关,但最亮的只有白色,最不亮的只有黑色。

 

颜色空间(颜色模型):描述颜色的三维空间坐标系,一个颜色定义为颜色空间的一个点。

1.灰度模式:“灰度”模式可以表现出丰富的色调,但是也只能表现黑白图像。“灰度”模式图像中的像素是由8位的分辨率来记录的,能够表现出256种色调,从而使黑白图像表现的更完美。灰度模式的图像只有明暗值,没有色相和饱和度这两种颜色信息。其中,0%为黑色,100%为白色,K值是用来衡量黑色油墨用量的。使用黑白和灰度扫描仪产生的图像常以灰度模式显示。

2.位图模式:“位图”模式的图像又叫黑白图像,它用黑、白两种颜色值来表示图像中的像素。其中的每个像素都是用1 bit的位分辨率来记录色彩信息的,占用的存储空间较小,因此它要求的磁盘空间最少。位图模式只能制作出黑、白颜色对比强烈的图像。如果需要将一副彩色图像转换成黑白颜色的图像,必须先将其转换成“灰度”模式的图像,然后再转换成黑白模式的图像,即“位图”模式的图像。

在OpenCV中,彩色图像使用OpenCV加载时是BGR模式。但是在Matplotlib中是RGB模式,所以彩色图像如果已经被OpenCV读取,那他将不会被Matplotlib正确显示。

3.HSV颜色模型:也称六角锥体模型(Hexcone Model)。、这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。在HSV颜色空间中要比在BGR空间中更容易表示一个特定颜色。

H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。相隔120度。互补色分别相差180度。

V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。(以下的HSI模型应该就是HSV模型)

 

图像描述:

 

距离度量:描述图像中像素之间的距离。

欧几里得距离:距离点(i,j)小于或者等于某一值是以点(i,j)为原点的圆

城市街区(小区)距离:距离点(i,j)小于或者等于某一值是以点(i,j)为中心的菱形

棋盘距离距离:;距离点(i,j)小于或者等于某一值是以点(i,j)为中心的正方形

 

2017-03-31 15:07:59 xiaosongaa 阅读数 12033
  • 数据库的基本概念

    1、MySQL的完整学习路径和底层运行机制 2、掌握发挥MySQL的最佳性能的优化方法 3、掌握如何处理海量业务数据和高并发请求 4、增加工作和面试时的竞争力

    27328课时 0分钟 12528人学习 刘运强
    免费试看

英文原文链接:  https://www.codeproject.com/articles/781213/fundamentals-of-image-processing-behind-the-scenes

原作者:  

中文原文链接:

翻译者: xiaosongaa

图像处理基本原理 

Fundamentals of Image Processing - behind the scenes

介绍 Introduction


在过去的20年中,图像处理算法变得非常流行,这主要是由于数字摄影技术的快速扩展。如今,数码摄像头是如此常见,我们甚至没有注意到他们在我们的日常生活中。当我们在地铁,机场,高速公路等等场景都会被录像并分析----图像处理算法分析我们的脸,检测我们的行为,识别我们的车牌,并注意到,我们离开了我们的行李。
此外,我们大多数人都在像类似PS或GIMP软件使用图像处理技术来获得有趣的艺术效果。
但是,无论这些算法有多先进,它们仍然依赖于基本原理。在这篇文章中,我们将介绍基本的图像处理算法,这将有助于了解什么是我们的图形编辑器软件计算背后的场景。

基本原理

互联网一姐 First Lady of the Internet

在我们开始我们的图像处理旅程之前,我们应该认识一下这位模特和她的照片,这是一个简短的故事。


对于那些涉足图像处理领域的人来说,这张照片是众所周知的。上面的图片显示了瑞典模特Lenna Soderberg(nee Sjööblom)。它最初是花花公子杂志1972年11月刊上的一张插画。
这张照片在1973年的一个意外的机会中,首次被用于图像处理领域 , 从此以后,它已成为图像处理和压缩研究领域最重要的照片。

数字世界中的图像信息表示 Image representation in digital world

我们肉眼每天所观察到的世界是一个连续的模拟图像,这是我们的眼睛处理图像的方式.要使用数字设备捕捉模拟图像,就必须对其进行采样和量化----这就是数字化处理。

采样

对连续的2D信号(图像)进行采样,我们将依据预先定义的行数和列数得到一个完整的二维信号数组。给定行和列相交处的点(元素)称为像素。采样原始图像是一个有损操作-采样图像的质量取决于预设的采样水平。

  

用不同采样等级得到的图像

量化

量化等级表示的是在数字图像中,每个像素的取值范围.常用的量化等级有2,64,256,1024,4096,16384等等。举例来说,如果我们使用1024个量化等级,那么在图像中每个像素可能的取值就是0~1023(原文为0~1024,应该有误)中的某个数。

  

使用不同量化等级得到的图像


色彩

对数字图像来说,最后一个要素是每个像素的色彩。当前最流行的色彩模型是RGB模型,我们用红绿蓝3个颜色分量来表示任意一种颜色。在RGB模式图像中,每个像素点包含了其在3个颜色分量下的饱和度。

另一个常用的色彩模型是HSV,HSV模型同样使用3个分量来表示色彩:色调,饱和度,明度.这个模型可以在颜色空间中表示为一个 圆锥形。


在印刷行业,最受欢迎的颜色模式 是CMYK,它包含4种基本颜色:青,品红,黄,黑,它们互相调和形成最终的颜色.

 


直方图Histogram

图像直方图是图像中每种颜色或亮度等级发生次数的统计信息。直方图告诉我们很多关于图像的信息----不仅限于亮度和对比度。使用直方图,我们可以判断图像细节是否已被正确捕获和存储。
在分析彩色图像时,我们接收每个颜色的直方图(RGB)。灰度图像则使用单一的直方图。

 

 

彩色和灰度图像的直方图


2019-05-18 19:14:27 JustDoIt_201603 阅读数 849
  • 数据库的基本概念

    1、MySQL的完整学习路径和底层运行机制 2、掌握发挥MySQL的最佳性能的优化方法 3、掌握如何处理海量业务数据和高并发请求 4、增加工作和面试时的竞争力

    27328课时 0分钟 12528人学习 刘运强
    免费试看

数字图像:每一个数字图像都是一个像素点矩阵,这个矩阵包含所有像素点的强度值

像素点:最小的图像单元,一张图像由好多的像素点组成。像素就是图像的尺寸

位图:也称点阵图,它是由许多点组成的,这些点称为像素。当许多不同颜色的点组合在一起后,便构成了一副完整的图像。 位图可以记录每一个点的数据信息,从而精确地制作色彩和色调变化丰富的图像。但是,由于位图图像与分辨率有关,它所包含的图像像素数目是一定的,若将图像放大到一定程度后,图像就会失真,边缘出现锯齿。

灰度:表示图像像素明暗程度的数值,也就是黑白图像中点的颜色深度。若灰度级为256,灰度值的范围一般从0到255,白色为255 ,黑色为0。灰度值指的是单个像素点的亮度,灰度值越大表示越亮。灰度级表明图像中不同灰度的最大数量灰度级越大,图像的亮度范围越大。在单色图中, intensity 是 强度  gray scale 是灰度。而强度一般由光源的能量和物体反射能量的比例的乘积决定,所以如果能量很低,颜色就很暗,极限就是能量为0,是黑色,而能量很大,就很亮,最大为255白色。

通道:把图像分解成一个或多个颜色成分;①单通道:一个像素点只需一个数值表示,只能表示灰度,0为黑色; ②三通道:RGB模式,把图像分为红绿蓝三个通道,可以表示彩色,全0表示黑色;③四通道:在RGB基础上加上alpha通道,表示透明度,alpha=0表示全透明

深度:深度即位数(比特数)①位深:一个像素点所占的总位数,也叫像素深度、图像深度等,其中位深 = 通道数 × 每个通道所占位数  ②256色图:n位的像素点可以表示2^n种颜色,称2^n色图,n=8时为256色图 ③8位RGB与8位图:前者的位数指每个通道所占的位数,后者指整个像素点共占的位数,其中8位RGB是一个24位图,也称为真彩

对比度:指不同颜色之间的差别。对比度越大,不同颜色之间的反差越大,即所谓黑白分明,对比度过大,图像就会显得很刺眼。对比度越小,不同颜色之间的反差就越小。对比度=最大灰度值/最小灰度值

亮度:指照射在景物或图像上光线的明暗程度。图像亮度增加时,就会显得耀眼或刺眼,亮度越小时,图像就会显得灰暗。

色相:颜色,调整色相就是调整景物的颜色,例如,彩虹由红、橙、黄、绿、青、蓝、紫七色组成,那么它就有七种色相。顾名思义即各类色彩的相貌称谓,如大红、普蓝、柠檬黄等。色相是色彩的首要特征,是区别各种不同色彩的最准确的标准。事实上任何黑白灰以外的颜色都有色相的属性,而色相也就是由原色、间色和复色来构成的

色调:各种图像色彩模式下原色的明暗程度,级别范围从0到255,共256级色调。例如对灰度图像,当色调级别为255时,就是白色,当级别为0时,就是黑色,中间是各种程度不同的灰色。在RGB模式中,色调代表红、绿、蓝三种原色的明暗程度,对绿色就有淡绿、浅绿、深绿等不同的色调。色调是指色彩外观的基本倾向。在明度、纯度、色相这三个要素中,某种因素起主导作有用,可以称之为某种色调

饱和度:指图像颜色的浓度。饱和度越高,颜色越饱满,即所谓的青翠欲滴的感觉。饱和度越低,颜色就会显得越陈旧、惨淡,饱和度为0时,图像就为灰度图像。可以通过调整电视机的饱和度来进一步理解饱和度的概念。

频率:灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。低频就是颜色缓慢地变化,也就是灰度缓慢地变化,就代表着那是连续渐变的一块区域,这部分就是低频。 高频就是频率变化快,即相邻区域之间灰度相差很大,这就是变化得快。图像中,一个影像与背景的边缘部位的频率高,即高频显示图像边缘。图像的细节处也是属于灰度值急剧变化的区域,正是因为灰度值的急剧变化,才会出现细节。另外噪声(即噪点)也是这样,在一个像素所在的位置,之所以是噪点,就是因为它与正常的点颜色不一样了,灰度有了快速地变化。固有“图像的低频是轮廓,高频是噪声和细节”。

空域:也叫空间域,即所说的像素域,在空域的处理就是在像素级的处理,如在像素级的图像叠加。通过傅立叶变换后,得到的是图像的频谱。表示图像的能量梯度。

频域: 也叫频率域,任何一个波形都可以分解成多个正弦波之和。每个正弦波都有自己的频率和振幅。所以任意一个波形信号有自己的频率和振幅的集合。频率域就是空间域经过傅立叶变换的信号

图像分辨率:每英寸图像内的像素点数。分辨率越高,像素的点密度越高,图像越逼真。

空间分辨率:图像中可辨别的最小细节的度量,如果一幅图像的尺寸为MxN,表明在成像时采集了MxN个样本,空间分辨率是MxN。

灰度分辨率:在灰度级中可分辨的最小变化,在数字图像处理教程中,灰度分辨率指的是色阶,色阶是表示图像亮度强弱的指数标准,也就是我们说的色彩指数。灰度分辨率指亮度,和颜色无关,但最亮的只有白色,最不亮的只有黑色。

颜色空间(也称为“颜色模型”):描述颜色的三维空间坐标系,一个颜色定义为颜色空间的一个点。

1.灰度模式:“灰度”模式可以表现出丰富的色调,但是也只能表现黑白图像。“灰度”模式图像中的像素是由8位的分辨率来记录的,能够表现出256种色调,从而使黑白图像表现的更完美。灰度模式的图像只有明暗值,没有色相和饱和度这两种颜色信息。其中,0%为黑色,100%为白色,K值是用来衡量黑色油墨用量的。使用黑白和灰度扫描仪产生的图像常以灰度模式显示。

2.位图模式:“位图”模式的图像又叫黑白图像,它用黑、白两种颜色值来表示图像中的像素。其中的每个像素都是用1 bit的位分辨率来记录色彩信息的,占用的存储空间较小,因此它要求的磁盘空间最少。位图模式只能制作出黑、白颜色对比强烈的图像。如果需要将一副彩色图像转换成黑白颜色的图像,必须先将其转换成“灰度”模式的图像,然后再转换成黑白模式的图像,即“位图”模式的图像。

转载于“https://blog.csdn.net/u010608296/article/details/84799265