2015-10-13 15:51:00 ternenceWei 阅读数 469

在很多时候我们需要对一张图片进行裁剪,尽管CALayer已经为我们提供了很多方便,可以轻易实现圆形,圆角矩形,甚至直角+圆角的矩形,然而在一些特殊情况下,需要对图片进行不规则形状(比如半个⭐️)裁剪的时候,就需要一些手段来进行图片处理了。

当然如果用CALayer来画path的话,任何形状都是可以画的,但是必须把每一个轮廓都写一遍,而描述这些轮廓,会随着图形复杂度而相应的繁琐,更糟糕的是,如果换一个形状,就要重新进行一次复杂的描述,那简直是噩梦。
       所以在这里我们推荐一种简单的办法:Mask 切割
       这个办法的原理很简单,需要先准备一张切割形状的非半透明图片,通过与被切割图片求交集的方式进行切割,得到的结果就是切割形状的图片了。比如你要把一幅图片切割成半⭐️形的,就准备一张半⭐️形状的mask图,图中需要有一个半⭐️的非透明部分,其余部分透明,然后把希望裁剪的图片以mask图作为模版裁剪,得到的就是想要的结果了.
    +   =     
 
来看看代码:
 

    1.首先准备好原图

    UIImage* rawImage = [UIImage imageNamed:@"photo.png”];
    2.初始化绘图环境
    CGSize size = image.size;
    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    3.将原图先画入内存中
    [image drawInRect:CGRectMake(0,0, size.width, size.height)];
    4.读取mask图片
    UIImage* mask = [UIImage imageNamed:@"mask.png"];
    5.(核心)将原图以mask为模版进行切割
    [mask drawInRect:CGRectMake(0, 0, size.width, size.width)       
            blendMode:kCGBlendModeDestinationIn 
                alpha:1];
     //此处的参数可分为source和destination,分别去共同部分和不同部分。
    6.生成想要的结果图
    UIImage* retImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return retImage;
 
   ok,会了这招以后,接下来运用到实战当中,比如在QQ的多人聊天组头像(梅花状头像组),就可以通过这种方式来实现。
    那么接下来可以看到,在实际情况中,主要是针对3,4,5,6人头像进行绘制。那么仔细观察就会发现,其实他们是用的同一个mask,只是根据不同的人数,各自旋转不同的角度,以及进行不同程度的缩放,最后组合而成。
    以3个头像为例:
    1.先计算出三个头像的分布

     if (imageCount == 3) {
            head_s = 26;
            CGRect rcImage = CGRectMake((bg_width - head_s) / 2, (bg_height - head_s - 3), head_s, head_s);
            [rectArray addObject:[NSValue valueWithCGRect:rcImage]];
            rcImage = CGRectMake(0, 0, head_s, head_s);
            [rectArray addObject:[NSValue valueWithCGRect:rcImage]];

            rcImage = CGRectMake((bg_width - head_s), 0, head_s, head_s );
            [rectArray addObject:[NSValue valueWithCGRect:rcImage]];
     
        }
    2.在确定三个头像的位置后,接下来确定各自的角度 

        for ( int j=0; j<imageCount; ++j ){

            UIImage *image_inx = [imageArray objectAtIndex:j];
            if (imageCount > 2 || j == 0) {

                double angel = startAngel - 2 * j * M_PI / imageCount;

    3.然后根据各自度数进行’月牙形’裁剪
                image_inx = [self maskImageWithSize:image_inx angle:angel];

            }

            CGRect rcImage = [[rectArray objectAtIndex:j] CGRectValue];
            CGContextDrawImage(context, rcImage, image_inx.CGImage);
        }
    4.最后将三幅图都画在一起便得到了一个梅花状的头像组。
2019-05-15 23:00:39 qq_38024084 阅读数 480

灰度变换 

灰度

灰度可以认为是亮度,灰色图片中黑白的深浅程度,范围一般为0~255。图像数字化为二维矩阵后,每个点的值都代表一个像素点的灰度值。

灰度级

L=2^{k}

灰度值的表示范围,2^{k}灰度级时,称图片为k比特图片。当然灰度级越高,图片的细节则越清晰,因为有更多的灰度值来描述图片。但是灰度级越大,图片所需要的存储空间也会越大,因此一般会采用256灰度级。

灰度变换  空间滤波

g(x,y)=T\left [ f(x,y) \right ]

空间域处理图像(直接对f(x,y)进行操作)T[  ]就像是一个操作的函数,将图像f (x,y)输入后会进行不同的操作,操作结果为g (x,y)。

S=T(r)

一般用上述形式表示变换的过程,r和S分别表示变换前后的像素值(灰度),T表示某种变换函数

目前学到的有灰度变换和空间滤波,灰度变换包括图像反转,对数变换,幂次变换,直方图均衡、匹配,空间滤波包括平滑滤波和锐化滤波

图像反转

这里主要是线性变换,将某一范围的灰度值映射到另一个线性范围

S=L-1-r (r\subset [0,L-1])

我们对某位患者的胸片进行处理,原图中有白色絮状物体,但是图片整体偏暗,不便于观察,于是我们进行线性的反转,将较亮部位与较暗部位进行互换,如下图所示,肉眼可见观察的更加清晰了。

胸片 线性变换

图像反转代码

imadjust(f,[low_in, high_in ],[low_out, high_out])将图片的[low_in, high_in]范围映射到[low_out, high_out],我们需要进行反转,就将low_out > low_in 

f=imread('C:\Matlab Project\image\Fig0303(a)(breast).tif');
g=imadjust(f,[0 0.8],[1 0]);
figure(1)
title('图像反转');
subplot(1,2,1);imshow(f)
subplot(1,2,2);imshow(g)

对数变换

S=c*log(1+r)

对数变换

根据对数函数的特征,会将输入图像的灰度值中较暗部分 r < L/4 部分映射到 [0  3L/4]这个较大的范围,而较亮部分则会映射到较小的区域。这个函数会将图像暗处的细节放大,压缩亮处的细节。最具代表的就是对傅里叶频谱的对数运算,从对比图中可以看到暗处的细节被放大输出

对数变换

代码

f=imread('C:\Matlab Project\image\Fig0305(a)(spectrum).tif');
g=0.8*log(1+double(f));
figure()
subplot(1,2,1);imshow(f)
subplot(1,2,2);imshow(g)

幂次变换

S=C*r^{\gamma }

\gamma<1时,效果和对数函数相似,放大暗处细节,压缩亮处细节,随着数值减少,效果越强

\gamma>1时,放大亮处细节,压缩暗处细节,随着数值增大,效果越强

代码

测试为\gamma>1的情况,图片效果和对数变换差别不大

测试\gamma=0.1的情况,将暗处细节放大,亮处细节压缩

f=imread('C:\Matlab Project\image\Fig0305(a)(spectrum).tif');
g=double(f).^0.1;
figure()
subplot(1,2,1);imshow(f,[])
subplot(1,2,2);imshow(g,[])

测试\gamma=10的情况,将暗处细节放大,压缩亮出细节,图片变得更暗了

f=imread('C:\Matlab Project\image\Fig0305(a)(spectrum).tif');
g=double(f).^10;
figure()
subplot(1,2,1);imshow(f,[])
subplot(1,2,2);imshow(g,[])

位图切割

由于灰度级L=2^{k},是有2的次方构成,每个像素值看作是由K个二进制数组成的

r=a1*2^{k-1}+a2*2^{k-2}....+a7*2^1+a8*2^0

于是每个平面k-1,k-2,....,1,0 中的每一个像素值都等于该像素在该平面的项数值

代码

感觉有些冗余,但是目前还不知道怎么修改,以后再改

f=imread('C:\Matlab Project\image\original_test_pattern.tif');
g=double(f);
L1=mod(g,2);
L2=mat2gray(mod(g./2,2));
L3=mat2gray(mod(g./(2.^2),2)); 
L4=mat2gray(mod(g./(2.^3),2)); 
L5=mat2gray(mod(g./(2.^4),2)); 
L6=mat2gray(mod(g./(2.^5),2)); 
L7=mat2gray(mod(g./(2.^6),2)); 
L8=mat2gray(mod(g./(2.^7),2)); 
figure()
subplot(3,3,1);imshow(L1),title('第一层');
subplot(3,3,2);imshow(L2),title('第二层');
subplot(3,3,3);imshow(L3),title('第三层');
subplot(3,3,4);imshow(L4),title('第四层');
subplot(3,3,5);imshow(L5),title('第五层');
subplot(3,3,6);imshow(L6),title('第六层');
subplot(3,3,7);imshow(L7),title('第七层');
subplot(3,3,8);imshow(L8),title('第八层');
subplot(3,3,9);imshow(f),title('原图');

直方图 均衡 匹配

直方图:

 h(r_{k})=n_{k}   表示像素值r_{k}在图像中出现的次数n_{k},下图显示的是图片对应的直方图

代码

f=imread('C:\Matlab Project\image\Fig0308(a)(pollen).tif');
h1=imhist(f,256); %函数imhist 得到一维数组频数 不直接输出
h2=h1(1:10:256); %转化为条形图
horz=1:10:256;
figure()
subplot(1,2,1);imshow(f);
subplot(1,2,2); h2=bar(horz,h2,0.6);
axis([0 255 0 15000]) %直方图输出范围(横0-256 纵 0-15000 )
set(gca,'xtick',0:50:255)
set(gca,'ytick',0:2000:12000)

直方图均衡

归一化直方图:P(r_{k})=n_{k}/n  表示像素值r_{k}在图像中出现的概率

S=T(r)=\sum_{j=0}^{k}P_{r}(r_{j})=\sum_{j=0}^{k}n_{j}/n

可以将函数变换到直方图较均衡分布的状态

直方图变换的S=T(r)函数,通过归一化直方图相加获得

代码

matlab 中使用histeq(f,256)直接获得均衡后的图像

f=imread('C:\Matlab Project\image\Fig0308(a)(pollen).tif');
h1=imhist(f,256);
h2=histeq(f,256);  %histeq均衡后得到为图像
figure(1)
subplot(2,2,1);imshow(f);
subplot(2,2,2);plot(h1);
subplot(2,2,3);imshow(h2);
subplot(2,2,4);imhist(h2); 

hnorm=imhist(f)./numel(f);  %注意为原图像的概率,不是均衡后的
cdf=cumsum(hnorm);  % 变换函数S=T(r)
x=linspace(0,1,256);
figure(2)
plot(x,cdf);
axis([0 1 0 1])
set(gca,'xtick',0:0.2:1)
set(gca,'ytick',0:0.2:1)

直方图匹配

直方图匹配是在均衡的基础上进行,希望最后处理后的图像符合某种特定的直方图分布。为什么要这样呢,主要是因为均衡是将整个图像整体的均衡,可能将整体的图片变化的太暗或是太亮,如图,左边为原图,中间为直方图均衡,右边为直方图匹配。

通过下图直方图均衡的变化函数S=T(r),也能看出,均衡将函数值变得偏大,图像便整体偏大

再分析图像变化前后的直方图分布,我们可以发现,原图的像素值主要分布在较暗和较亮两个极端位置,但是直方图均衡就粗暴的将大家都平均了。

假设我们希望最后图像归一化直方图为P_{z}(z)

求相应的变换函数

G(z)=\sum_{i=0}^{q}P_{z}(Z_{i})

而输入图像的变换函数为S=T(r)

我们希望他们相等

G(z)=T(r)

便可求出S到Z的映射

代码

matlab 通过  histeq(f,hspec) 函数来实现,hspec为最后希望的直方图

由于输入图像的直方图类似双峰高斯函数,所以我们将hspec设置为双峰高斯函数由函数twomodegauss获得

twomodegauss

function p = twomodegauss(m1,sig1,m2,sig2,A1,A2,k)
%TWOMODEGAUSS 返回双峰高斯函数
%   p = twomodegauss(m1,sig1,m2,sig2,A1,A2,k)
%   p为标准化256个元素,sum(p)=1,
%  (m1,sig1),(m2,sig2)分别为双峰的均值和标准差,
%  A1,A2分别为峰值,k为基数

c1 = A1 * (1 / ((2 * pi) ^ 0.5) * sig1);
k1 = 2 * (sig1 ^ 2);
c2 = A2 * (1 / ((2 * pi) ^ 0.5) * sig2);
k2 = 2 * (sig2 ^ 2);
z = linspace(0, 1, 256);

p = k+c1*exp(-((z-m1).^2)./k1)+c2*exp(-((z-m2).^2)./k2);
p = p./sum(p(:));

实现代码

f=imread('C:\Matlab Project\image\Fig0310(a)(Moon Phobos).tif');
p = twomodegauss(0.15,0.05, 0.75, 0.05,1, 0.07, 0.002);
g=histeq(f,p);
figure(1)
subplot(1,3,1);imshow(f);
subplot(1,3,2);imshow(histeq(f,256));
subplot(1,3,3);imshow(g);

 

 

 

2018-03-28 16:28:10 qq_38784454 阅读数 1718
clc;
clear all;
[pathname,filename] = uigetfile('*.*','选择图片','E:\裂纹\NG2裂纹\');
src_path =strcat(filename,pathname) ;
dst_path = 'E:\学习资料\MATLAB程序\裂纹分割\';
if ~exist('E:\学习资料\MATLAB程序\裂纹分割\')
    mkdir('E:\学习资料\MATLAB程序\裂纹分割\');
end

A = imread(src_path);
figure;
imshow(A);
[m,n,l] = size(A);
a = 8;
figure;
for i = 1:a
    for j = 1:a
    m_start = 1+ (i-1)*fix(m/a);
    m_end = i*fix(m/a);
    n_start = 1+ (j-1)*fix(m/a) ;
    n_end = j*fix(n/a);
    AA = A(m_start:m_end,n_start:n_end,:);
    imwrite(AA,[dst_path num2str(i) '_' num2str(j) '.jpg'],'jpg');
    subplot(8,8,(i-1)*8+j);
    imshow(AA);
    hold on;
    end
end

原图:

2014-10-12 13:25:40 wozhendebuhaoma 阅读数 2759

图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术的一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。 常见的系统有康耐视系统、图智能系统等,目前是正在逐渐兴起的技术。

图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术的一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。 常见的系统有康耐视系统、图智能系统等,目前是正在逐渐兴起的技术。

图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术的一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。 常见的系统有康耐视系统、图智能系统等,目前是正在逐渐兴起的技术。图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术的一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。 常见的系统有康耐视系统、图智能系统等,目前是正在逐渐兴起的技术。图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术的一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。 常见的系统有康耐视系统、图智能系统等,目前是正在逐渐兴起的技术。

http://zhidao.baidu.com/question/519528446090102645.html

http://zhidao.baidu.com/question/391593318895377005.html

http://zhidao.baidu.com/question/617082845639831412.html

http://zhidao.baidu.com/question/1946820750805557828.html

http://zhidao.baidu.com/question/1702286530212076180.html

http://zhidao.baidu.com/question/1238528588771891699.html

http://zhidao.baidu.com/question/1238528652585891459.html

http://zhidao.baidu.com/question/2010245200610808468.html

http://zhidao.baidu.com/question/2010308752180544028.html

http://zhidao.baidu.com/question/1238592204736973419.html

http://zhidao.baidu.com/question/2010309201259490868.html

http://zhidao.baidu.com/question/680698400065462692.html

http://zhidao.baidu.com/question/455208937458346285.html

http://zhidao.baidu.com/question/1860437354781339187.html

http://zhidao.baidu.com/question/1238656589677680619.html

http://zhidao.baidu.com/question/1238656653749463099.html

http://zhidao.baidu.com/question/680698721128169452.html

http://zhidao.baidu.com/question/1860437611195301507.html

http://zhidao.baidu.com/question/1860437674878353067.html


2019-12-20 10:36:34 rong11417 阅读数 141

目录

1.介绍

2.模拟图像处理

3.数字图像处理

4.什么是图像

5.数字图像和信号之间的关系

信号

关系

6.如何形成数字图像

7.应用

机器/计算机视觉

计算机图形学

人工智能

信号处理


1.介绍

数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。   数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展;二是数学的发展(特别是离散数学理论的创立和完善);三是广泛的农牧业、林业、环境、军事、工业和医学等方面的应用需求的增长。

信号处理是电气工程和数学领域的一门学科,处理模拟和数字信号的分析和处理,并处理信号的存储,滤波和其他操作。这些信号包括传输信号,声音或语音信号,图像信号和其他信号等

在所有这些信号中,处理信号类型的字段是在图像处理中完成的,对于该信号,输入是图像,而输出也是图像。顾名思义,它处理图像处理。

它可以进一步分为模拟图像处理和数字图像处理。

2.模拟图像处理

模拟图像处理是对模拟信号进行的。它包括对二维模拟信号的处理。在这种类型的处理中,通过改变电信号通过电手段来操纵图像。常见的例子包括电视图像。

随着时间的流逝,数字图像处理已超过模拟图像处理,这是由于其应用范围更广。

3.数字图像处理

数字图像处理涉及开发对数字图像执行操作的数字系统。

4.什么是图像

图像不过是二维信号。它由数学函数f(x,y)定义,其中x和y是水平和垂直两个坐标。

任意点的f(x,y)值给出了图像该点的像素值。

上图是您现在在计算机屏幕上查看的数字图像的示例。但实际上,该图像不过是二维数组,其范围是0到255之间的数字。

128 30 123
232 123 321
123 77 89
80 255 255

每个数字在任何点都代表函数f(x,y)的值。在这种情况下,值128、230、123分别表示单个像素值。图片的尺寸实际上就是这个二维数组的尺寸。

5.数字图像和信号之间的关系

如果图像是二维阵列,那么它与信号有什么关系?为了了解这一点,我们需要首先了解什么是信号?

信号

在物理世界中,可以将随时间在空间上或任何更高维度上可测量的任何数量视为信号。信号是一种数学函数,它传达一些信息。

信号可以是一维或二维或更高维的信号。一维信号是随时间测量的信号。常见的例子是语音信号。

二维信号是在其他一些物理量上测得的信号。二维信号的示例是数字图像。在下一个教程中,我们将详细介绍如何形成和解释一维或二维信号以及更高的信号。

关系

由于在两个观察者之间的物理世界中传达信息或广播消息的任何事物都是信号。这包括语音或(人声)或图像作为信号。自从我们讲话时,我们的声音就转换为声波/信号,并根据与之交谈的时间而改变。不仅如此,而且数码相机的工作方式(例如从数码相机获取图像时)都涉及将信号从系统的一部分传输到另一部分。

6.如何形成数字图像

由于从相机捕获图像是一个物理过程。阳光被用作能源。传感器阵列用于图像的采集。因此,当阳光照射到物体上时,传感器会感应到该物体反射的光量,并通过感应到的数据量生成连续的电压信号。为了创建数字图像,我们需要将该数据转换为数字形式。这涉及采样和量化。(它们将在后面讨论)。采样和量化的结果导致二维数组或数字矩阵,它们不过是数字图像。

7.应用

机器/计算机视觉

机器视觉或计算机视觉处理开发的系统,其中输入是图像,输出是某些信息。例如:开发一个扫描人脸就可以支付的系统。这个系统看起来像这样。

计算机图形学

计算机图形学处理对象模型中图像的形成,然后由某些设备捕获图像。例如:对象渲染。从对象模型生成图像。这样的系统看起来像这样。

人工智能

人工智能或多或少是将人类智能纳入机器的研究。人工智能在图像处理中有许多应用。例如:开发计算机辅助诊断系统,以帮助医生解释X射线,MRI等图像,然后突出显示要由医生检查的明显部分。

信号处理

信号处理是一个保护伞,而图像处理则位于其中。物体在物理世界(3d世界)中反射的光量穿过相机的镜头,并成为2d信号,因此导致图像形成。然后使用信号处理方法将该图像数字化,然后在数字图像处理中操纵此数字图像。

MATLAB 图像切割

阅读数 1544

图像处理

阅读数 283

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