2017-01-07 10:21:55 u011630458 阅读数 638

简介

  前段时间研究单帧超分辨率实现,发现了一个智能缩放算法,虽然和我要做的不是一个东西,但是感觉挺不错,实现记录下来了。
参考论文:Seam Carving for Content-Aware Image Resizing

实现背景

  在普通的缩放过程中,不管是普通临近插值缩放、双线性插值或者其他复杂一些的插值算法,在图像进行横向、纵向非等比例插值时候,都会不可不免的出现图像主题形变之类情况,导致观测主体缩放后,效果不理想。
这里换了一种思路,通过图像最小能量曲线,动态规划方式进行图像插值,使得图像在插值后,尽可能保持主体基本一致,结果图像能有更好感官效果。

具体实现

基本原理

  1、缩小放大时候,找到图像横向/纵向最小能量曲线(梯度/散度在该曲线上最小)。
    2、删除掉该曲线,图像曲线左右两边像素往中间靠,删除曲线位置,图像靠近像素加权融合。

实现流程

  1、计算图像横向纵向梯度和图像。
    2、新建一张能量图和坐标偏移图。
    3、从梯度图像第一行开始,比较每个像素和它左右像素梯度大小,对应能量图坐标叠加三个中最小梯度像素,对应坐标偏移图,根据最小像素位置,分别填入0,1,2。
    4、从上到下,遍历完整个梯度图之后,能量线总能量则叠加存入到了能量图最后一行中,坐标偏移图中保存了能量线在当前位置对应往下一个位置的坐标偏移量。
    5、遍历能量图最后一行,找到能量值最小的坐标,该点坐标及为最小能量线起始坐标。
    6、从最小能量线起始坐标开始,根据坐标偏移图向上查询,进而得到最小能量线。
    7、删除原图像最小能量线对应像素,并将剩下图像进行融合。
    8、将处理后图像作为原图像,继续下一轮最小能量线操作,得到最后结果图像。

结果显示

  首先看下基本效果如下:
      原始图像:
               
      普通纵向压缩后图像:
               
      论文算法纵向压缩后图像:
               
  可以看到,本文算法压缩之后的图片,对比普通压缩结果,效果要好不少,不过需要注意下,删除最小能量线之后,这里只是用了简单左右加权的简单方式融合,所以结果图像看起来会有些异常,
有兴趣的小伙伴再继续拓展吧。
具体代码下载:http://download.csdn.net/detail/u011630458/9731175

2017-12-31 20:18:41 coming_is_winter 阅读数 2496
图像处理之图像分割(三)之图割(Graph cut)分割简单梳理

        Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation)、立体视觉(stereo vision)、抠图(Image matting)等。

       此类方法把图像分割问题与图的最小割(min cut)问题相关联。首先用一个无向图G=<VE>表示要分割的图像,VE分别是顶点(vertex)和边(edge)的集合。此处的Graph和普通的Graph稍有不同。普通的图由顶点和边构成,如果边的有方向的,这样的图被则称为有向图,否则为无向图,且边是有权值的,不同的边可以有不同的权值,分别代表不同的物理意义。而Graph Cuts图是在普通图的基础上多了2个顶点,这2个顶点分别用符号”S”和”T”表示,统称为终端顶点。其它所有的顶点都必须和这2个顶点相连形成边集合中的一部分。所以Graph Cuts中有两种顶点,也有两种边。


参考文献:
zouxy09      图像分割之(二)Graph Cut(图割)    http://blog.csdn.net/zouxy09/article/details/8532111
《图像处理、分析与机器视觉(第三版)》     作者 :Milan Sonka、艾海舟。
2016-07-22 16:57:18 shengshengwang 阅读数 860

1. GrabCut算法

解析:cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount[, mode]) → None:前景和背景分离。

(1)mask-掩模图像,用来确定那些区域是背景,前景,可能是前景/背景等。可以设置为cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD,或者直接输入0,1,2,3

(2)rect:包含前景的矩形。

(3)bdgModel和fgdModel:两个大小为(1,65),数据类型为np.float64的数组。

(4)mode:可以设置为cv2.GC_INIT_WITH_RECT或cv2.GC_INIT_WITH_MASK,也可以联合使用。

GrabCut算法是对Graph Cut算法的改进,如下所示:

(1)Graph Cut的目标和背景的模型是灰度直方图,Grab Cut取代为RGB三通道的混合高斯模型GMM;

(2)Graph Cut的能量最小化(分割)是一次达到的,而Grab Cut取代为一个不断进行分割估计和模型参数学习的交

互迭代过程;

(3)Grab Cut允许不完全的标注,Graph Cut需要用户指定目标和背景的一些种子点,但是Grab Cut只需要提供背景

区域的像素集,最后如果需要得到更精确的分割,可以在初次分割的结果上加上一些确定的种子点,再运行算法。


2. np.any和np.all

解析:

只要数组中有一个值为True,则np.any()返回True;而只有数组的全部元素都为True,np.all()才返回True。


3. np.ndarray和np.array区别

解析:

(1)np.ndarray

Definition : array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
Type : Function of numpy.core.multiarray module

(2)np.array

Definition : ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None)
Type : Function of numpy module

说明:推测np.ndarray是一个low-level ndarray构造器,而np.array相对来说是一个high-level ndarray构造器,不知道这样理解对不对。另外,numpy模块中的矩阵对象为numpy.matrix,包括矩阵数据的处理,矩阵的计算,以及基本的统计功能。


4. 灰度图,彩色图,二值图

解析:0是黑,255是白。


5. numpy.poly1d [2]numpy.polyfit [3]

解析:

(1)class numpy.poly1d(c_or_r, r=0, variable=None):A one-dimensional polynomial class.

>>> p = np.poly1d([1, 2, 3])
>>> print(np.poly1d(p))
   2
1 x + 2 x + 3
>>> p = np.poly1d([1, 2, 3], True)
>>> print(np.poly1d(p))
   3     2
1 x - 6 x + 11 x - 6

说明:np.poly1d([1, 2, 3])即np.poly1d([1, 2, 3], True)即

(2)numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False):Least squares polynomial fit.

多项式插值法:用二次多项式逼近f(x),称为二次插值法,用三次多项式逼近f(x),称为三次插值法。

>>> x = np.array([0.0, 1.0, 2.0, 3.0,  4.0,  5.0])
>>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
>>> z = np.polyfit(x, y, 3) # 三次多项式插值法
>>> p = np.poly1d(z)
>>> p30 = np.poly1d(np.polyfit(x, y, 30)) # 三十次多项式插值法
>>> import matplotlib.pyplot as plt
>>> xp = np.linspace(-2, 6, 100)
>>> _ = plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '--')
>>> plt.ylim(-2,2)
>>> plt.show()

输出结果,如下所示:



6. np.polyder

解析:

多项式求导函数,返回导函数的系数。比如,np.polyder([3, 2, 1])的结果为array([6, 2])。即对多项式求导,结果为


7. np.argmax()和np.argmin()

解析:

通过np.argmax(),np.argmin()可以得到取得最大或最小值时的下标。


8. cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst

解析:

(1)ksize:Gaussian kernel size. ksize.width and ksize.height can differ but they both must be positive and odd. Or, they can be zero’s and then they are computed from sigma*.

(2)sigmaX:Gaussian kernel standard deviation in X direction.

(3)sigmaY:Gaussian kernel standard deviation in Y direction; if sigmaY is zero, it is set to be equal to sigmaX, if both sigmas are zeros, they are computed from ksize.width and ksize.height , respectively (see getGaussianKernel() for details); to fully control the result regardless of possible future modifications of all this semantics, it is recommended to specify all of ksize, sigmaX, and sigmaY.

(4)borderType:pixel extrapolation method (see borderInterpolate() for details).


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

解析:

(1)src1:first input array.
(2)alpha:weight of the first array elements.
(3)src2:second input array of the same size and channel number as src1.
(4)beta:weight of the second array elements.
(5)dst:output array that has the same size and number of channels as the input arrays.
(6)gamma:scalar added to each sum.
(7)dtype:optional depth of the output array; when both input arrays have the same depth, dtype can be set to -1, which will be equivalent to src1.depth().

Note: The function addWeighted calculates the weighted sum of two arrays as follows: dst = src1*alpha + src2*beta + gamma.


10. 图像锐化

解析:图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空域处理和频域处理两类。


11. PIL是ImageFilter的滤镜模块  

解析:

(1)ImageFilter.BLUR:模糊滤镜。
(2)ImageFilter.CONTOUR:轮廓。
(3)ImageFilter.EDGE_ENHANCE:边界加强。
(4)ImageFilter.EDGE_ENHANCE_MORE:边界加强(阀值更大)。
(5)ImageFilter.EMBOSS:浮雕滤镜。
(6)ImageFilter.FIND_EDGES:边界滤镜。
(7)ImageFilter.SMOOTH:平滑滤镜。
(8)ImageFilter.SMOOTH_MORE:平滑滤镜(阀值更大)。
(9)ImageFilter.SHARPEN:锐化滤镜。


12. 图像金字塔

解析:图像金字塔是以多分辨率来解释图像的一种结构,就是同一图像的不同分辨率的子图集合。有两类图像金字塔:高斯金字塔和拉普拉斯金字塔。可以使用函数cv2.pyrDown()和cv2.pyrUp()构建图像金字塔。函数cv2.pyrDown()从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低)。函数cv2.pyrUp()从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。图像金字塔可以用在图像融合中,拉普拉斯金字塔常用在图像压缩中,拉普拉斯金字塔可由高斯金字塔得到。


参考文献:

[1] GrabCut: interactive foreground extraction using iterated graph cuts:http://dl.acm.org/citation.cfm?id=1015720

[2] numpy.poly1d:http://docs.scipy.org/doc/numpy/reference/generated/numpy.poly1d.html#numpy.poly1d

[3] numpy.polyfit:http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html

2018-05-27 10:36:05 weixin_42002291 阅读数 155

五.特征提取

 

特征提取属于图像分析的范畴

 

图像特征:

直观感受:亮度,边缘,纹理和色彩;通过变换或处理得到的:矩,直方图,主成分

分类:描述物体外形的形状特征和描述物体表面灰度变化的纹理特征

 

简单的区域描述子:

周长:区域边界的长度,即位于边界上像素数目

面积:区域中像素总数

区域的质心

灰度均值:区域中所有像素平均值

灰度中值:区域中所有像素排序中值

包含区域的最小矩形

最大或最小灰度级

致密性:(周长)²/面积

大于或小于均值的像素数

欧拉数:区域中的对象减去这些对象的空洞数

 

D=regionprops(L,properties);

L是标记矩阵,用bwlabel得到

 

properties的合法取值:

1)        ’area’ 面积 

2)        ‘boundingbox’ 包含区域最小矩形1*4向量:[矩形左上角x最标,y最表,x方向长度,y方向长度]

3)        ‘centroid’:区域质心 1*2向量:[质心x坐标,y坐标]

4)        ‘equivdiameter’:和区域有着相同面积的圆的直径

5)        

D是结构数组

 

P=bwlabel(I); 标注连通区,得到标记矩阵

D= regionprops(P,’area’,’centroid’);  提取面积和质心

D.Area

D.Centroid

V1=[D.Area];   将面积转存为向量

V2=[D.Centroid]; 将质心转存为向量

 

直方图为图像纹理描述的一种有力手段

直方图常用统计特征:均值,标准方差,平滑度,三阶矩,一致性,熵

但他是一种区分能力较弱的统计特征:直方图和纹理并非一一对应的关系

2019-06-21 18:41:48 qq_36684690 阅读数 8

什么是优化

英文为Optimization,又称数学规划(Mathematical Programming),是指从一个可行解的集合中寻找出最优的元素。

常见的优化问题

数据拟合问题

LQR次调节器,目标是让能量最小。

多用户能量控制问题

寻找用户传输的功率最佳分布使得流量最大

图像处理问题

TV-L_2模型,使得处理后的图像分片光滑。

超大规模集成电路设计

门电路的组合,使得功耗最小来实现某功能。

最短路径问题

可以转化为一个线性规划问题

优化问题分类

线性规划/非线性规划

线性性的式子

凸规划/非凸规划

这才是一个问题是否难的本质所在,用一个不等式来定义。

光滑/非光滑

非光滑不是本质的难

连续/离散

往往离散比较难,但和非凸优化相比,不是本质的。

单目标/多目标

帕累托曲面

凸优化研究历史

最早从Newton求方程根开始算,目前认为线性规划中最佳方法的为内点法(1984)。

主要研究内容

研究对象

光滑、单目标、凸优化

主要内容

  • 凸集、凸函数、凸优化
  • 凸优化理论
  • 若干算法

snake 模型

阅读数 4451

opencv主动轮廓模型

阅读数 1057

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