2018-01-15 11:13:21 u013165921 阅读数 1601
  • Python+OpenCV3.3图像处理视频教程

    Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用开发佳实践课程。

    5427 人正在学习 去看看 贾志刚

实验要求

  (1.a) 编写程序实现图6.23,程序的输入为图像中指定的两个灰度级范围。程序的输出为RGB 格式图像,其中,一个灰度级范围显示为指定的彩色,其余的像素以RGB 形式显示为与输入图像对应像素相同的灰度色。

  (1.b) 用上述程序对图1.10(4)进行处理,要求使河流呈现为黄色,其余区域像素与原输入图像灰度保持一致。在结果图像中一些孤立区域一般也会呈现黄色,因此需要选取合适的灰度级范围,使这样的区域尽可能少。

  (2.a) 将dark-stream 图6.35 (该图即图6.35(05))转换为RGB 分量图。用直方图均衡化程序对R, G 和B分量图分别进行直方图均衡化,然后将结结果图转换回jpg 格式。

  (2.b) 用(2.a)中的三个直方图构成一个平均直方图,以此直方图为基础得到单一的直方图均衡化强度变换函数。将该函数分别单独作用到R, G 和B 分量图上,将结果图转换为jpg 格式。比较并解释(2.a)和(2.b)中图像的差异。


技术论述

1、伪彩色图像处理

  伪彩色(也称假彩色)图像处理是指基于一种指定的规则对灰度值赋以颜色的处理。 伪彩色用于区分对单色图像赋予彩色的处理和与真彩色图像相关的处理,应用于人目视观察和解释单幅图像或序列图像钟的灰度级事件。使用彩色的动力之一是人类可以辨识几千种色调和强度,而相比之下只能辨别20多种灰度。

这里写图片描述

2、灰度分层

  灰度分层(也称密度分层)是伪彩色图像处理最简单的例子之一。如果一副图像被描述为三维图像,则分层方法可以看成是放置一些平行于该图像的坐标平面,然后,每个平面在相交的区域中“切割”图像函数。下图是通过一个平面将图像函数分割为两部分的一个例子。

  实验中,要求程序的输入为图像中指定的两个灰度级范围。程序的输出为RGB 格式图像,其中,一个灰度级范围显示为指定的彩色,其余的像素以RGB 形式显示为与输入图像对应像素相同的灰度色。可通过灰度分层方法进行实现,设定灰度级范围即使用两个平面以“切割”图像,使得灰度级范围内的图像按照要求显示相应彩色颜色。

这里写图片描述

3、对RGB分量图进行直方图均衡化

这里写图片描述

  直方图均衡化的基本思想是对图像中像素个数多的灰度级进行扩展,而对图像中像素个数少的灰度进行压缩,从而扩展像素的取值范围,提高对比度和灰度色调的变化,使图像更加清晰。

  直方图均衡化一来可以提高图像的对比度,二来可以把图像变换成像素值是几乎均匀分布的图像。

  假定r已经标准化在[0,1]区间内,r=0表示黑色,r=1表示白色,变换函数为:

s=T(r), 0 =< r < = 1,

  满足以下条件: (a)T(r)是一单值函数,并且在区间[0,1]单调递增; (b)对 0 <= r <= 1,0<= T(r) <=1。

这里写图片描述


实验结果

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


实验程序

% --------------------------------------------------第1问----------------------------------------------

f1 = imread('Fig1.10(4).jpg');
f1_change = change_color(f1,0,20);

subplot(2,1,1);imshow(f1);title('图像Fig1.10(4)');
subplot(2,1,2);imshow(f1_change);title('河流呈现为黄色');


% --------------------------------------------------第2问----------------------------------------------

f2 = imread('Fig6.35(5).jpg');

r = f2(:,:,1);                             % R分量
g = f2(:,:,2);                             % G分量
b = f2(:,:,3);                             % B分量

% ---------用直方图均衡化程序对R, G 和B分量图分别进行直方图均衡化-------------

r_equal = hist_equal(r);                    % 直方图均衡化
g_equal = hist_equal(g);
b_equal = hist_equal(b);

img_equal(:,:,1) = r_equal;                 % 将RGB分量图转换为单一RGB图像
img_equal(:,:,2) = g_equal;
img_equal(:,:,3) = b_equal;

% -------用平均直方图均衡化强度变换函数分别作用到R, G 和B分量图上-------------

r_hist = imhist(r);
g_hist = imhist(g);
b_hist = imhist(b);
mean_hist = (r_hist + g_hist + b_hist)/3.;  % 计算平均直方图

r1 = match(r,mean_hist);                    % 直方图匹配
g1 = match(g,mean_hist);
b1 = match(b,mean_hist);

img_mean(:,:,1) = r1;                       % 将RGB分量图转换为单一RGB图像
img_mean(:,:,2) = g1;
img_mean(:,:,3) = b1;


% ---------------------------------------------显示图像----------------------------------------------

figure;                                   
subplot(2,1,1);imshow(f2);title('图像Fig6.35(5)');
subplot(2,1,2);imshow(img_equal);title('分别直方图均衡化后结果');
imwrite(img_equal,'img_equal.jpg','jpg');   % 转换回jpg格式

figure;
subplot(3,2,1);imhist(r);title('R分量直方图');                    
subplot(3,2,2);imhist(r_equal);title('% R分量均衡化后直方图');             
subplot(3,2,3);imhist(g);title('G分量直方图');
subplot(3,2,4);imhist(g_equal);title('% G分量均衡化后直方图');     
subplot(3,2,5);imhist(b);title('B分量直方图');
subplot(3,2,6);imhist(b_equal);title('% B分量均衡化后直方图');     

figure;imshow(img_mean);title('平均直方图均衡化后结果')
imwrite(img_mean,'img_mean.jpg','jpg');   % 转换回jpg格式
function img_out = change_color(img,gray_low,gray_high)
% 根据题意,指定颜色为黄色rgb(255,255,0)

[M,N] = size(img);

for m = 1:M
    for n = 1:N
        if img(m,n) >= gray_low && img(m,n) <= gray_high
            img_out(m,n,1) = 255;
            img_out(m,n,2) = 255;
            img_out(m,n,3) = 0;
        else
            img_out(m,n,1) = img(m,n);
            img_out(m,n,2) = img(m,n);
            img_out(m,n,3) = img(m,n);
        end
    end
end

end
function img_hist_equal = hist_equal(img)
% 直方图均衡化

[M,N] = size(img);
img = double(img);
H = zeros(1,256);

for k = 0:255                                    % 获取各个灰度级的数量
    for m = 1:M
        for n = 1:N
            H(k+1) = H(k+1) + (img(m,n) == k);
        end
    end
end

P = H/(M*N);                                    % 各个灰度级的概率

for k = 2:256                                     % 灰度级累计概率
    P(k) = P(k) + P(k-1);
end

I = uint8(round(P.*255)); % 从[0,1]映射到[0,255]

for m = 1:M
    for n = 1:N
        img_hist_equal(m,n) = I(img(m,n)+1);
    end
end
function img_equal = match(img,mean_hist)
% 直方图匹配

[M,N] = size(img);
img = double(img);

P = mean_hist/(M*N);                           % 各个灰度级的概率

for k = 2:256                                  % 灰度级累计概率
    P(k) = P(k) + P(k-1);
end

for k = 1:256                                  % 从[0,1]映射到[0,255]
    I = uint8(round(P.*255));
end

for m = 1:M
    for n = 1:N
        img_equal(m,n) = I(img(m,n)+1);
    end
end

figure;
x = 0:255;
plot(x,P(x+1));
title('直方图均衡化变换函数图');

end
2016-03-27 17:15:05 chongshangyunxiao321 阅读数 6494
  • Python+OpenCV3.3图像处理视频教程

    Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用开发佳实践课程。

    5427 人正在学习 去看看 贾志刚

人的生理视觉系统特征对微小的灰度变化感觉不敏感,而对彩色的微小差别极为敏感,利用这一特点就可以把人眼不敏感的灰度信号映射为人眼灵敏的彩色信号,以增强人对图像中细微变换的分辨率。

在图像处理技术中,彩色增强应用十分广泛且效果显著

常见的彩色增强技术主要有假彩色增强和伪彩色增强两大类

(1)假彩色增强

思路是将灰度分层几级,比如我们这里将灰度分为16级,然后每一级灰度对应一种彩色。在查看原图中某像素,找出它所属的灰度级,用相应的彩色代替就行了

(2)伪彩色处理

由灰度值根据一定的映射关系求出R,G,B的值,组成该点的彩色值

典型的映射关系图为:
这里写图片描述

Python测试代码如下:

__author__ = 'Administrator'
import cv

def Color(image):
    w = image.width
    h = image.height
    size = (w,h)
    iColor = cv.CreateImage(size,8,3)
    for i in range(h):
        for j in range(w):
            r = GetR(image[i,j])
            g = GetG(image[i,j])
            b = GetB(image[i,j])
            iColor[i,j] = (r,g,b)
    return iColor

def GetR(gray):
    if gray < 127:
        return 0
    elif gray > 191:
        return 255
    else:
        return (gray-127)*4-1


def GetG(gray):
    if gray < 64:
        return 4*gray
    elif gray > 191:
        return 256-(gray-191)*4
    else:
        return 255

def GetB(gray):
    if gray < 64:
        return 255
    elif gray > 127:
        return 0
    else:
        return 256-(gray-63)*4

def FColor(image,array):
    w = image.width
    h = image.height
    size = (w,h)
    iColor = cv.CreateImage(size,8,3)
    for i in range(h):
        for j in range(w):
            iColor[i,j] = array[int(image[i,j]/16)]
    return iColor

FCArray = [(0,51,0),(0,51,102),(51,51,102),(51,102,51),\
            (51,51,153),(102,51,102),(153,153,0),(51,102,153),\
            (153,102,51),(153,204,102),(204,153,102),(102,204,102),\
            (153,204,153),(204,204,102),(204,255,204),(255,255,204)]
image = cv.LoadImage('18.jpg',0)
iColor = Color(image)
iFColor = FColor(image,FCArray)
cv.ShowImage('image',image)
cv.ShowImage('iColor',iColor)
cv.ShowImage('iFColor',iFColor)
cv.WaitKey(0)

我们来看看运行结果:
这里写图片描述

2018-01-09 16:08:33 Hanging_Gardens 阅读数 4007
  • Python+OpenCV3.3图像处理视频教程

    Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用开发佳实践课程。

    5427 人正在学习 去看看 贾志刚

图像通道

彩色图像转灰度

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('/home/keysen/caffe/examples/images/cat.jpg')
gray=img.convert('L')
plt.figure("beauty")
plt.imshow(gray,cmap='gray')
plt.axis('off')
plt.show()

Output

这里写图片描述

使用函数convert()来进行转换,它是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式,mode 的取值可以是如下几种:
· 1 (1-bit pixels, black and white, stored with one pixel per byte)
· L (8-bit pixels, black and white)
· P (8-bit pixels, mapped to any other mode using a colour palette)
· RGB (3x8-bit pixels, true colour)
· RGBA (4x8-bit pixels, true colour with transparency mask)
· CMYK (4x8-bit pixels, colour separation)
· YCbCr (3x8-bit pixels, colour video format)
· I (32-bit signed integer pixels)
· F (32-bit floating point pixels)

通道分离与合并

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('/home/keysen/caffe/examples/images/cat.jpg')  #打开图像
gray=img.convert('L')   #转换成灰度
r,g,b=img.split()   #分离三通道
pic=Image.merge('RGB',(r,g,b)) #合并三通道
plt.figure("beauty")
plt.subplot(2,3,1), plt.title('origin')
plt.imshow(img),plt.axis('off')
plt.subplot(2,3,2), plt.title('gray')
plt.imshow(gray,cmap='gray'),plt.axis('off')
plt.subplot(2,3,3), plt.title('merge')
plt.imshow(pic),plt.axis('off')
plt.subplot(2,3,4), plt.title('r')
plt.imshow(r,cmap='gray'),plt.axis('off')
plt.subplot(2,3,5), plt.title('g')
plt.imshow(g,cmap='gray'),plt.axis('off')
plt.subplot(2,3,6), plt.title('b')
plt.imshow(b,cmap='gray'),plt.axis('off')
plt.show()

Output

这里写图片描述

裁剪图像

从原图片中裁剪感兴趣区域(roi),裁剪区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('/home/keysen/caffe/examples/images/cat.jpg')  #打开图像
plt.figure("beauty")
plt.subplot(1,2,1), plt.title('origin')
plt.imshow(img),plt.axis('off')

box=(80,100,260,300)
roi=img.crop(box)
plt.subplot(1,2,2), plt.title('roi')
plt.imshow(roi),plt.axis('off')
plt.show()

Output

这里写图片描述

几何转换

Image类有resize()、rotate()和transpose()方法进行几何变换

图像的缩放和旋转

re_img = img.resize((200, 200))
rot_img = img.rotate(45) # 逆时针角度表示
plt.figure("cat")
plt.subplot(1,2,1) , plt.title('resize')
plt.imshow(re_img), plt.axis('off')

plt.subplot(1,2,2) , plt.title('rotate')
plt.imshow(rot_img) , plt.axis('off')
plt.show()

Output

这里写图片描述

转换图像

dst = im.transpose(Image.FLIP_LEFT_RIGHT) #左右互换
dst = im.transpose(Image.FLIP_TOP_BOTTOM) #上下互换
dst = im.transpose(Image.ROTATE_90)  #逆时针旋转
dst = im.transpose(Image.ROTATE_180)
dst = im.transpose(Image.ROTATE_270)

Output

这里写图片描述

transpose()和rotate()没有性能差别

2017-07-02 19:15:12 riba2534 阅读数 276615
  • Python+OpenCV3.3图像处理视频教程

    Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用开发佳实践课程。

    5427 人正在学习 去看看 贾志刚

首先,我们平时所用的彩色图像是RGB色,分别有三个图像通道:
red(0-255),green(0-255),blue(0-255)
1. 可以把一张图像理解为一个二维矩阵,在矩阵中每一个点都有一个属性,就是它的RGB色,以此来构成一个图像
2. 我们只需要改变对应像素点的对应值,就可以对一张图像进行操作

以下是两个图像变换的实例:

1.这是一个普通的把一张彩色图片通过对它每一个像素点的操作变成它的相反的颜色的

from PIL import Image
import numpy as np
a=np.array(Image.open('001.jpg'))
print(a.shape,a.dtype)
b=[255,255,255]-a
im=Image.fromarray(b.astype('uint8'))
im.save('002.jpg')

2. 这是图像中的一些黑白变换:

from PIL import Image
import numpy as np
a=np.array(Image.open('001.jpg').convert('L'))#.convert是变成黑白的

b=255-a#在对应的颜色通道减去他自己变成黑白底片的效果
im=Image.fromarray(b.astype('uint8'))
im.save('003.jpg')


c=(100/255)*a+150#区间变换,颜色比较淡的灰度的图片
im=Image.fromarray(c.astype('uint8'))
im.save('004.jpg')

d=255*(a/255)**2#像素平方,颜色比较深的图
im=Image.fromarray(d.astype('uint8'))
im.save('005.jpg')

3. 图像的手绘效果的变换:

先上代码:

from PIL import Image
import numpy as np
a=np.array(Image.open('测试.jpg').convert('L')).astype('float')

depth=10                        #(0-100)
grad=np.gradient(a)             #取图像灰度的梯度值
grad_x,grad_y=grad              #分别取横纵图像的梯度值
grad_x=grad_x*depth/100.
grad_y=grad_y*depth/100.
A=np.sqrt(grad_x**2+grad_y**2+1.)
uni_x=grad_x/A
uni_y=grad_y/A
uni_z=1./A

vec_el=np.pi/2.2                        #光源的俯视角度,弧度值
vec_az=np.pi/4                          #光源的方位角度,弧度值
dx=np.cos(vec_el)*np.cos(vec_az)        #光源对x轴的影响
dy=np.cos(vec_el)*np.sin(vec_az)        #光源对y轴的影响
dz=np.sin(vec_el)                       #光源对z轴的影响

b=255*(dx*uni_x+dy*uni_y+dz*uni_z)      #光源归一化
b=b.clip(0,255)

im=Image.fromarray(b.astype('uint8'))
im.save('手绘效果.jpg')    

代码解析:

根据灰度变化来模拟人类视觉的远近程度

  • 设计一个位于图像斜上方的虚拟光源
  • 光源相对于图像的俯视角为Elevation, 方位角为Azimuth
  • 建立光源对个点梯度值的影响函数
  • 运算出各点的新像素值


2019-08-05 15:45:12 qq_37749442 阅读数 28
  • Python+OpenCV3.3图像处理视频教程

    Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用开发佳实践课程。

    5427 人正在学习 去看看 贾志刚
from PIL import Image
img = Image.open('lena.jpg')

1、img.mode

     返回图像模式。对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

PIL中有九种不同模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。

2、 img.convert() 

      实例:img1 = img.convert('L')    #  返回一个“L”模式的图像(灰度图像)

      色彩空间的转换,支持多种不同模式图像(PNG,BMP,JPG,RGB)

3、img.getpixel((x,y))

     得到某个像素点的颜色,一般返回(r,g,b)

4、img.colors

     返回颜色统计列表(count,color),可以判断图像中的色彩分布

5、img.show()

     显示图像,会启动一个新窗口

6、img.size          #  图像属性

      得到图像的大小,返回值为tuple

7、img.format

      返回图像的格式,‘JPEG’

8、img.getbands()

      输出元组(‘R’,‘G’,‘B’)

 

 

经过(/255.0)归一化后,要返回原来的图像先进行*255,将数组data进行变换:Image.fromarray(new_data.astype(np.uint8))

 

待续........................

彩色图像处理

阅读数 4

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