2017-04-07 23:45:07 zww1984774346 阅读数 1163

项目地址:https://github.com/MisterZhouZhou/OpenCVDemo

美白实现:

  1、利用系统方法实现美白就是通过操作像素点分量的值来达到美白的效果。

 2、利用OpenCv是通过bilateralFilter进行双边滤波操作

1、系统美白方法:

/**
 *  图像美白处理处理
 * @prama originImage 原始图片
 * @return 美白后图片
 */
- (UIImage *)zw_OpenCVWhiteImageWithImage:(UIImage *)originImage{
    // 第一步 :获取图片的大小
    // 目的:开辟内存空间
    CGImageRef imageRef = [originImage CGImage];
    NSUInteger widht = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    // 第二步 :创建颜色空间(写死未彩色)
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    // 第三步 :创建图片上下文(作用:保存图片信息)
    // 参数一:数据源(指向图片的指针,RGBA 4分量,每个分量8位,共4字节,像素指针32位)
    // 参数二:图片的宽
    // 参数三:图片的高
    // 参数四:每一个像素分量的大小(8)
    // 参数五:每一行占用的内存大小(最大RGBA 为4个字节)
    // 参数六:颜色空间
    // 参数七:布局参数
    // calloc(count ,size) count表示像素点点位数,size像素大小
    UInt32 *inputPixels = (UInt32*)calloc(widht *height, sizeof(UInt32));
   CGContextRef contextRef = CGBitmapContextCreate(inputPixels, widht, height, 8, widht*4, colorSpaceRef, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

    // 第四步:根据图片的上下文绘制图片
    // 参数一:图片上下文信息
    // 参数二:图片的宽
    // 参数三:图片的高
    // 参数四:绘制的对象
    CGContextDrawImage(contextRef, CGRectMake(0, 0, widht, height), imageRef);

    // 第五步美白
    // 美白操作 -> 操作像素点 -> 操作分量
    // 亮度值
    int lumi = 30;
    for (int i = 0; i<height; i++) {
        for (int j = 0; j<widht; j++) {
            // 获取当前指针
            UInt32 *currentPixels = inputPixels + (i * widht) +j;
            UInt32 color = *currentPixels;
            // 操作像素点(操作像素值 -> 操作ARGB分量值)
            // 重新定义ARGB分量值
            UInt32 thisA,thisR,thisG,thisB;
            // 给四个分量重新赋值
            thisR = R(color);
            thisR = thisR + lumi;
            thisR = thisR > 255 ? 255:thisR;

            thisG = G(color);
            thisG = thisG + lumi;
            thisG = thisG > 255 ? 255:thisG;

            thisB = B(color);
            thisB = thisB + lumi;
            thisB = thisB > 255 ? 255:thisB;

            thisA = R(color);

            // 更新像素点
            *currentPixels = RGBAMake(thisR, thisG, thisB, thisA);
        }
    }

    CGImageRef newImageRef = CGBitmapContextCreateImage(contextRef);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    // 释放内存
    CGColorSpaceRelease(colorSpaceRef);
    CGContextRelease(contextRef);
    CGImageRelease(newImageRef);

    return newImage;
}

2、OpenCV美白方法:

/**
 *  图像美白处理处理
 * @prama originImage 原始图片
 * @return 美白后图片
 */
- (UIImage *)zw_OpenCVWhiteImageWithImage:(UIImage *)originImage{
    //第一步 : iOS 图片转OpenCv图片(四通道)
    Mat mat_image_src;
    UIImageToMat(originImage, mat_image_src);

    //第二步 图片(四通道)转 三通道
    Mat mat_image_dst;
    cvtColor(mat_image_src, mat_image_dst, CV_RGBA2RGB,3);

    // 第三步 :克隆一个数据用于美白
    Mat mat_image_clone = mat_image_dst.clone();

    // 第四步:开始美白
    for (int i = 1; i < MAX; i += 2) {
        // 磨皮效果
        // 参数一:原始图片
        // 参数二:模版图片
        // 参数三:下标
        bilateralFilter(mat_image_dst, mat_image_clone, i, i * 2, i / 2);
    }

    // 第五步 :将OpenCv图片转iOS图片
    return MatToUIImage(mat_image_clone);

}

美白先后效果对比:
这里写图片描述

这里写图片描述

2019-01-24 15:17:07 qinglingLS 阅读数 1495

以下内容均有参考,
非原作者允许,请勿用于商业用途!!!
仅供大家学习交流所用!!

一、	实验内容
1. 去除人脸图像中的雀斑
2. 去除图像中的背景和水印的去除。
二、	实验目的
1. 综合运用图像处理的知识解决实际问题。 
2. 了解颜色空间在图像处理中的用途。 
3. 了解常见滤波在图像处理中的用途。 
4. 了解图像修复(Image Inpainting)的常见方法。

综述

代码在最后!
我这里提出了四种思路,
但是其实说到底,可以归类为两种思路:
1.模糊后适当提亮并锐化
2.保边滤波。

网上很多博客对这些内容说的非常神秘,点进去也没有什么干货,
在这方面,需要研究的还有很多,
大家保持低调也正常,另外一些算法也有版权保护,不便写出来,
不然不是全天下的美图秀秀和b612了吗,你说对吧。
话不多说,先展示下效果吧!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

我这个人很懒,实验报告我写好了,贴在下面,
懒得再粘在博客上再排一次版了,
你自己下了慢慢看吧。
https://download.csdn.net/download/qinglingls/10936225

觉得好滴,记得微信打赏俺哟
在这里插入图片描述

代码如下:

https://download.csdn.net/download/qinglingls/10936244

2017-04-11 18:20:37 horisea 阅读数 2716

一:前言

 1.0  :  站在巨人的肩膀上编程,学习别人的思想,学习别人的代码风格,整理好了,就是自己的。
 1.1 :最近听了直播课程,了解了图片处理功能,然后自己突发奇想做磨皮效果。
 1.2 :无demo说话不硬气,上github地址:https://github.com/horisea/PictureWhitening    
           欢迎star,你的星星是我持续创作的动力

二:先上效果图
原图美白图
超级美白图磨皮or马赛克
灰色图片

马丹:给我唐神弄一脸蒙蔽,话说我好不开心的。。


三:下面说具体实现思路:

3.1 : 大概实现思路(美白原理): 图像的显示,是一个个像素点的集合,每个像素点有自己的颜色空间,即是RGBA的单独分量,我们可以通过CGImage获取像素点集合,然后循环遍历每一个像素点集合,改变RGBA的值(每个值的范围是0-255,而且数值越大,越白),那我们把每个像素点的值增加30,是不是就整体变白了。。蒙蔽吧,上核心代码了,重要部分的注释代码,需要你自己理解和查阅资料了 。。

3.2 先上美白部分的核心代码
/**
 *  美白图片
 *  @param imageName        图片名称
 *  @param whiteness        美白系数  10-150之间  越大越白
 */
+ (UIImage *)whiteImageWithName:(NSString *)imageName
                      Whiteness:(int)whiteness;


/// 美白
+ (UIImage *)whiteImageWithName:(NSString *)imageName  Whiteness:(int)whiteness {

    if (!whiteness || whiteness < 10 ||  whiteness > 150) {
        return [UIImage imageNamed:imageName];
    }
    
    // 1.拿到图片,获取宽高
    CGImageRef imageRef = [UIImage imageNamed:imageName].CGImage;
    NSInteger width = CGImageGetWidth(imageRef);
    NSInteger height = CGImageGetHeight(imageRef);
    
    // 2:创建颜色空间(灰色空间, 彩色空间)->  开辟一块内存空间
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

    
    // 3:创建图片上下文
    // 为什么是UInt32类型,即是无符号32为int型 取值范围就是0-255之间
    // inputPixels是像素点集合的首地址
    UInt32 * inputPixels = (UInt32*)calloc(width * height, sizeof(UInt32));

    CGContextRef contextRef = CGBitmapContextCreate(inputPixels,
                                                    width,
                                                    height,
                                                    8, // 固定写法  8位
                                                    width * 4, // 每一行的字节  宽度 乘以32位 = 4字节
                                                    colorSpaceRef,
                                                    kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); // 自己查咯
    
    // 4:根据图片上线纹绘制图片
    CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef);
    
    // 5:循环遍历每个像素点进行修改
    for (int i = 0; i < height; i ++) {
        for (int j = 0; j <  width; j ++) {
            UInt32 * currentPixels = inputPixels + (i * width) + j; // 改变指针的指向  每一个像素点都能遍历到了
            UInt32 color = *currentPixels;
            
            UInt32 colorA,colorR,colorG,colorB;
            
            colorR = R(color);   // 此处宏定义  计算RGBA的值  是通过位运算算的  自己百度咯
            colorR = colorR + whiteness;
            colorR = colorR > 255 ? 255 : colorR;
            
            colorG = G(color);
            colorG = colorG + whiteness;
            colorG = colorG > 255 ? 255 : colorG;
            
            colorB = B(color);
            colorB = colorB + whiteness;
            colorB = colorB > 255 ? 255 : colorB;
            
            colorA = A(color);
            *currentPixels = RGBAMake(colorR, colorG, colorB, colorA);
        }
    }
    
    
    // 6:创建Image对象
    CGImageRef newImageRef = CGBitmapContextCreateImage(contextRef);
    UIImage * newImage = [UIImage imageWithCGImage:newImageRef];
    
    // 7:释放内存
    CGColorSpaceRelease(colorSpaceRef);
    CGContextRelease(contextRef);
    CGImageRelease(newImageRef);
    free(inputPixels);
    
    return newImage;
}

最后返回一个美白后的图片,在imageView上显示就可以了。。



3.3   在此代码的基础上,笔者就试了一下脸部磨皮美白效果的实现。。。
  1.想了想实现思路:控制器里点击imageView,获取点击事件的坐标,传递坐标值,修改图片对应位置的像素点的值,进行美白,就实现了,,那  么开始干。
  2。但是会有问题:下面说处理的时候的注意点
     2.1:  每个像素点是很小的,那么美白效果肯定不明显。所以处理单独的像素点,连带周围的像素点也一起处理了,那么就会是一个               面   变白,而不是一个点变白。
     2.2 :获取的点击事件只是imageView上的点,而不是对应的像素点。。因为图片可能很大,而是按照imageView的宽高显示的,                  那么我们需要拿到宽高比,乘以imageView上的点,就是像素点了。。
               还是很蒙蔽吗?举个例子: 图片宽200 高400  ,  imageView宽100,高200 ,那么这个图片就是等比压缩显示的。
                                         现在我们点击了imageView上的(50,100)的点,
                                         那么对应的像素点就是(50 * (200 / 100), 100 * (400 / 200));是这个道理吧;

 3.那么我们上磨皮(做成了和马赛克效果差不多)代码
/**
 *  磨皮美白图片
 *  @param image        图片
 *  @param touch        touch view上的点击点
 *  @param view         view 点击所在的View
 */
+ (UIImage *)dermabrasionImage:(UIImage *)image  touch:(UITouch *)touch view:(UIView *)view;

+ (UIImage *)dermabrasionImage:(UIImage *)image  touch:(UITouch *)touch view:(UIView *)view {
    int whiteness = 20; // 越大美白月明显
    // 1.拿到图片,获取宽高
    CGImageRef imageRef = image.CGImage;
    NSInteger width = CGImageGetWidth(imageRef);
    NSInteger height = CGImageGetHeight(imageRef);
    
    // 2:创建颜色空间(灰色空间, 彩色空间)->  开辟一块内存空间
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    
    
    // 3:创建图片上下文
    UInt32 * inputPixels = (UInt32*)calloc(width * height, sizeof(UInt32));
    
    CGContextRef contextRef = CGBitmapContextCreate(inputPixels,
                                                    width,
                                                    height,
                                                    8,
                                                    width * 4,
                                                    colorSpaceRef,
                                                    kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    
    // 4:根据图片上线纹绘制图片
    CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef);
    
    
    // 5.0 获取点击的坐标
    CGPoint currentPoint = [touch locationInView:touch.view];
    
    // 图片大小  和imageView的大小不一致   且能获取到的坐标为imageView的坐标  而不是像素点
    // 此处拿到缩放比例
    CGFloat widthScale = width / view.frame.size.width;
    CGFloat heightScale = height / view.frame.size.height;

    int x = ceilf(currentPoint.x * widthScale);  // imageView的x 乘以缩放比例   就成了像素点
    int y = ceilf(currentPoint.y * heightScale);
    
    
    // 5.1:修改当前像素点
    int magin = 15;
    for (int i = y - magin; i < y + magin; i ++) {  // 操作像素点附近区域的像素点
        for (int j = x - magin; j < x + magin ; j ++) {
            if (i != j) { // 这里想着  4个拐角不处理  就不会那么方
                UInt32 * currentPixels = inputPixels + (i * width) + j;
                UInt32 color = *currentPixels;
                
                UInt32 colorA,colorR,colorG,colorB;
                
                colorR = R(color);
                colorR = colorR + whiteness;
                colorR = colorR > 255 ? 255 : colorR;
                
                colorG = G(color);
                colorG = colorG + whiteness;
                colorG = colorG > 255 ? 255 : colorG;
                
                colorB = B(color);
                colorB = colorB + whiteness;
                colorB = colorB > 255 ? 255 : colorB;
                
                colorA = A(color);
                *currentPixels = RGBAMake(colorR, colorG, colorB, colorA);
            }
        }
    }
    // 6:创建Image对象
    CGImageRef newImageRef = CGBitmapContextCreateImage(contextRef);
    UIImage * newImage = [UIImage imageWithCGImage:newImageRef];
    
    // 7:释放内存
    CGColorSpaceRelease(colorSpaceRef);
    CGContextRelease(contextRef);
    CGImageRelease(newImageRef);
    free(inputPixels);
    
    return newImage;
}

3.3 最后上下灰色图片的核心代码
/**
 *  return 灰色图片
 *  @param imageName        图片名称
 */
+ (UIImage *)imageToGrary:(NSString *)imageName;

+ (UIImage *)imageToGrary:(NSString *)imageName {
    // 1.拿到图片,获取宽高
    CGImageRef imageRef = [UIImage imageNamed:imageName].CGImage;
    NSInteger width = CGImageGetWidth(imageRef);
    NSInteger height = CGImageGetHeight(imageRef);
    
    // 2:创建颜色空间(灰色空间
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
    
    CGContextRef contextRef = CGBitmapContextCreate(nil,
                                                    width,
                                                    height,
                                                    8, // 固定写法  8位
                                                    width * 4, // 每一行的字节  宽度 乘以32位 = 4字节
                                                    colorSpaceRef,
                                                    kCGImageAlphaNone); // 无透明度
    if (!contextRef) {
        return [UIImage imageNamed:imageName];
    }
 
    CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef);
    
    CGImageRef grayImageRef = CGBitmapContextCreateImage(contextRef);
    UIImage * graryImage = [UIImage imageWithCGImage:grayImageRef];
    //释放内存
    CGColorSpaceRelease(colorSpaceRef);
    CGContextRelease(contextRef);
    CGImageRelease(grayImageRef);
    return graryImage;
}



最后:后续可能还会写很多类似图片处理的demo,比如QQ中的灰色头像的实现等等。。
         再说下github地址:https://github.com/horisea/PictureWhitening
       若有什么问题,也可以联系楼主,http://blog.csdn.net/horisea/article/details/52025886 ,里面有楼主联系方式

如果你喜欢这篇文章,或者有任何疑问,可以扫描第一个二维码,加楼主好友哦

也可以扫第二个二维码,关注楼主个人微信公众号。这里有很多生活,职业,技术相关的文章哦。欢迎您的到来。

微信号:                                             公众号




2016-10-31 04:13:12 attilax 阅读数 1091

Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库


1.1. 5种常用的Photoshop滤镜,分别针对照片的曝光、风格色调、黑白照片处理、锐利度、降噪这五大方向。坦 1
1.2. Java Image Filters 是由 Jhlabs 开发的一组用来处理 Java 图像的类库,提供各种常用的图像处理效果,例如反转色、扭曲、水波纹、凹凸、黑白效果等等数十种效果, 1
1.3. Photoshop CS6常用8大滤镜中文集合版 3
1.4. 史上超强图像处理开源工具包--ImageMagick  4
1.5. Thumbnailator是一个用来生成图像缩略图的Java类库 4
1.6. Java Image Filters它几乎提供了PS上大部分的图像特效 4
1.7. Apache Commons Imaging 前身是 Apache Commons Sanselan ,这是一个用来读写各种图像格式的 Java 类库 4




1.1.5种常用的Photoshop滤镜,分别针对照片的曝光、风格色调、黑白照片处理、锐利度、降噪这五大方向。坦
1.2.Java Image Filters 是由 Jhlabs 开发的一组用来处理 Java 图像的类库,提供各种常用的图像处理效果,例如反转色、扭曲、水波纹、凹凸、黑白效果等等数十种效果,
如下图所示,更多的效果请看其网站首页:
 ChannelMixFilter - Mixes the RGB channels
 ContrastFilter - Adjusts brightness and contrast
 CurvesFilter - Apply adjustment curves to an image
 DiffusionFilter - Error-diffusion dithering
 DitherFilter - Ordered dithering
 ExposureFilter - Change the exposure of an image
 GainFilter - Adjusts gain and bias
 GammaFilter - Adjusts image gamma
 GrayFilter - Grays out an image
 GrayscaleFilter - Converts to grayscale
 HSBAdjustFilter - Adjusts hue, saturation and brightness
 InvertAlphaFilter - Inverts the alpha channel
 InvertFilter - Inverts image colors
 LevelsFilter - Adjust image levels
 LookupFilter - Change image colors with a lookup table
 MapColorsFilter - Replace a color
 MaskFilter - Channel masking
 PosterizeFilter - Posterization
 QuantizeFilter - Quantize an image to 256 colors for, say, GIF export
 RescaleFilter - Multiplies colors by a scaling factor
 RGBAdjustFilter - Adjusts red, green and blue levels
 SolarizeFilter - Solarization
 ThresholdFilter - Thresholding
 TritoneFilter - Create a tri-tone image


1.3.Photoshop CS6常用8大滤镜中文集合版
hotoshop 中的滤镜主要是用来实现图像的各种特殊效果,它在Photoshop中具有非常重要的作用,是一个用于产生图像特殊效果的工具。滤镜的操作虽然非常简单,但是真正用起来却很难恰到好处。现为大家提供这款Photoshop CS6常用8大滤镜中文集合版,使用很简单。
八个滤镜包括:
1、Alien.Skin.xenofex2
2、Eye Candy 5 Textures
3、Eye Candy 4000
4、NikColorEfex3 
5、抽出滤镜
6、灯光工厂3.0
7、然烧的梨树
8、人像磨皮滤镜2.3
安装方法:直接解压路径Adobe Photoshop CS6\Plug-ins\Panels,重起Photoshop即可使用。
具体说明:
Alien Skin Xenofex 2.0 汉化版
Xenofex 是Alien Skin公司一款功能强大的滤镜软件,是各类图像设计师不可多得的好工具。
Xenofex 2 Xenofex滤镜主要分:
Baked Earth(干裂效果),它能制作出干裂的土地效果。
Constellation(星群效果),它能产生群星灿烂的效果。
Crumple(褶皱效果),它能产生十分逼真的褶皱效果。
Flag(旗子效果),它能制作出各种各样迎风飘舞的旗子和飘带效果。
Distress(撕裂效果),能制作出一些自然剥落或撕裂文字的效果。
Lightning(闪电效果),能产生无数变化的闪电效果。
Little fluffy clouds(云朵效果),能生成各种云朵效果。
Origami(毛玻璃效果),能生成一种毛玻璃看东西的效果。
Rounded rectangle(圆角矩形效果),能产生各种不同形状的边框效果。
Shatter(碎片效果),能生成一种镜子被打碎的效果。
Puzzle(拼图效果),能生成一种拼图的效果。
Shower door(雨景效果),能生成雨中看物体的效果。
Stain(污点效果),能为图片增加污点效果。
Television(电视效果),能生成一种老式电视的效果。
Electrify(充电效果),能产生一种充电的效果。
STMPER(压模效果),可以满足您对于特殊平面影像创作上的需求。


1.4.史上超强图像处理开源工具包--ImageMagick 
1.5.Thumbnailator是一个用来生成图像缩略图的Java类库
1.6.Java Image Filters它几乎提供了PS上大部分的图像特效
 是一款基于Java的图像处理类库,特别是在图像滤镜特效方面,Java Image Filters简直就是强大到天衣无缝。它几乎提供了PS上大部分的图像特效


强大的Java图像滤镜特效类库Java Image Filters – 码农网.html
1.7.Apache Commons Imaging 前身是 Apache Commons Sanselan ,这是一个用来读写各种图像格式的 Java 类库


作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 
汉字名:艾提拉(艾龙),   EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
Atiend

2016-01-07 20:17:30 u011046042 阅读数 3536

美化的常见思路与手段:

1、美白与亮度

            美白,可以通过调整亮度,最好是一个曲线函数

2、去除脸部中的微小细节

-----轻微皱纹

-----轻微色斑

-----轻微红点

通过低通滤波、卷积模糊可以做到去噪。

3、边缘丢失,特征丢失 如何处理

边缘保留的算法-----Bilateral filter(高斯滤波)、 Mean-Shift Filter、LMS Filter、Digital TV(Total Variation)Filter........  边缘像素与混合恢复,寻找合适阈值

4、基本算法流程

5、算法选择

a、  卷积模糊方式

---------- 高斯模糊

----------盒子模糊

----------边缘保留(高斯双边、MeanShift模糊)

b、 边缘提取

----------no real edga extraction

----------sobol 算子或者其他梯度算子

----------拉普拉斯算子

3、阈值选择

---------依赖处理的图像选择的模糊方法与边缘梯度计算的方法

4、性能问题

---------高斯双边,MeanShift 边缘保留模糊算法,浮点算法 非常慢

---------优化加速, 取近似值?直方图加速?局部均方差方法,基于积分图像计算?




图像处理----美白

阅读数 4215

图像处理算法之美颜

阅读数 13642

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