2571|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求大神帮用neon优化c++代码,一次处理8个像素 [复制链接]

#pragma mark    图片处理(自动对比度)
- (UIImage *)autoContrastImage:(UIImage *)image
{
    unsigned char* pData = [self.image ARGBData];
    unsigned char* p_Data = pData;
    int width = self.image.size.width;
    int height = self.image.size.height;

    const int RED =1;
    const int GREEN =2;
    const int BLUE =3;
    double Low_Cut = 8;
    double High_Cut = 8;

    int HistRed[256] = {0};
    int HistGreen[256] = {0};
    int HistBlue[256] = {0};
    int HistRGB[256] = {0};

    int PixelAmount = width*height;
    int isum;
    unsigned int iMin_RGB,iMax_RGB,iMinRed,iMaxRed,iMinGreen,iMaxGreen,iMinBlue,iMaxBlue;
    //计算各通道直方图
    for (int j = 0; j
    {
        for (int i = 0; i
        {
            HistRed[pData[RED]] = HistRed[pData[RED]]+1;
            HistGreen[pData[GREEN]] = HistGreen[pData[GREEN]]+1;
            HistBlue[pData[BLUE]] = HistBlue[pData[BLUE]]+1;
            pData += 4;
        }
    }
    //计算各个通道的上下限值
    //red
    isum = 0;
    for (int j=0;j<256;j++){
        isum = isum + HistRed[j];
        if(isum >= PixelAmount * Low_Cut * 0.01 ){
            iMinRed = j;
            break;
        }
    }
    isum = 0;
    for (int j=255;j>=0;j--){
        isum = isum + HistRed[j];
        if(isum >= PixelAmount * High_Cut * 0.01 ){
            iMaxRed = j;
            break;
        }
    }
    //green
    isum = 0;
    for (int j=0;j<256;j++){
        isum = isum + HistGreen[j];
        if(isum >= PixelAmount * Low_Cut * 0.01 ){
            iMinGreen = j;
            break;
        }
    }
    isum = 0;
    for (int j=255;j>=0;j--){
        isum = isum + HistGreen[j];
        if(isum >= PixelAmount * High_Cut * 0.01 ){
            iMaxGreen = j;
            break;
        }
    }
    //blue
    isum = 0;
    for (int j=0;j<256;j++){
        isum = isum + HistBlue[j];
        if (isum >= PixelAmount * Low_Cut * 0.01){
            iMinBlue = j;
            break;
        }
    }
    isum = 0;
    for (int j=255;;j--){
        isum = isum + HistBlue[j];
        if (isum >= PixelAmount * High_Cut * 0.01){
            iMaxBlue = j;
            break;
        }
    }
    //获取三个通道下限值的最小值,以及上限值的最大值
    iMin_RGB = iMinRed>iMinGreen?iMinGreen:iMinRed;
    iMax_RGB = iMaxRed>iMaxGreen?iMaxRed:iMaxGreen;
    iMin_RGB = iMin_RGB>iMinBlue?iMinBlue:iMin_RGB;
    iMax_RGB = iMax_RGB>iMaxBlue?iMax_RGB:iMaxBlue;
    //以新的上下限值,计算隐射表
    for (int j=0;j<256;j++){
        if(j<=(unsigned int)iMin_RGB)
            HistRGB[j]=0;
        else if(j>=(unsigned int)iMax_RGB)
            HistRGB[j]=255;
        else
            HistRGB[j]= (255*(j-iMin_RGB))/(iMax_RGB-iMin_RGB);
    }
    //查表
    pData = p_Data;
    for (int j=0;j
    {
        for (int i=0;i
        {
            pData[RED] = HistRGB[pData[RED]];
            pData[GREEN] = HistRGB[pData[GREEN]];
            pData[BLUE] = HistRGB[pData[BLUE]];

            pData += 4;
        }
    }

    self.image = [UIImage imageWithARGBData:p_Data withSize:self.image.size];
    delete p_Data;
    p_Data=NULL;

    imageView.image = _image;
    return _image;
}

此帖出自ARM技术论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表