Matlab_图片16位转24位_批量转换

Matlab 图片16位转24位_批量转换

原理是先将16位图片转换成8位,再通过升维的方式,将一维堆叠为三维

picture_16_bit_to_24_bit.m(主代码)

%****************** 图片16位转24%%
clear;clc;tic;
pathold=cd;  % 当前路径
path='E:\';  % 找到文件夹路径
path1='E:\';  % 处理后数据存放主目录
subpath=obtain_subfolder_path(path);  % 获取当前文件夹下的子文件夹路径,存储在元组中,第一个为母文件路径;
first_path_length=size(subpath{1},2);  % 主目录字符长度
days=size(subpath,2);  % 获取subpath列长度,子文件夹数量
for i=2:1:days  % days,即要处理的文件数(一个文件是一天的数据),从2开始的原因是i=1是主文件夹目录,i=2后面才是子文件夹目录
    if(exist(subpath{i},'dir')~=0)  % 如果存在子文件(个数),目录类型,不等于0
        cd(subpath{i});  % 切换到当前目录
        file= ls('*.png');  % ls -列出文件名,列出每个后缀为.png的文件,并返回到file中,file是一个列向量
        cd(pathold);
        filenum=size(file,1);  % 取矩阵file的行的长度
        if(filenum~=0)
        j=size(subpath{i},2);  % j就等于子文件(第i个)的,列的长度
        path2=strcat(path1,subpath{i}(first_path_length:j));  % 生成新的子文件夹
        mkdir(path2);  % 生成新文件夹
        for k=1:filenum
            a=imread(strcat(subpath{i},file(k,:)));  % imread读取图像,strcat串联字符串,file(K,:)展开file的第j行
            b=(double(a)/255^2)*255;  %16位图片灰度值在double模式下等比计算为8位时呈现的值
            b=uint8(b);  % 将double变量转换成8位格式
            
            c(:,:,1) = b;
            c(:,:,2) = b;
            c(:,:,3) = b;  % 824位,即增加三个维度,每个维度数值都相同就行了
            
             imwrite(c,strcat(path2,file(k,:)));
        end
        end
    end
end
toc;

obtain_subfolder_path.m(函数)

function [ path ] =obtain_subfolder_path( input_path )
% 获取指定文件夹的子文件夹路径
% 元胞的第一个元素为母文件夹路径,其余为母文件夹下的子文件夹路径,如果母文件夹下不存在其他子文件夹则输出路径中只有母文件夹文件夹
% input_path --输入文件地址,用时可用path代替这里,然后用path=' '来添加文件地址

p=genpath(input_path);  % 获取当前文件夹中的子目录文件夹名称,保存为一行,且用‘;’号隔开
length_p=size(p,2);  % 获取行的字符长度,即保存的子目录矩阵为一行多列,这里的2就是求的列数(1就是行数)
                               % 子文件目录数,第一个地址为主目录地址,实际子目录数从第二个起
path={};  % 创建一个元包用来存放地址
temp=[];
index=1;  % 地址数目指针(就是说地址数目为1?)
for i=1:1:length_p  % 依次查询p中的地址字符串(从1到length_p长度,步长为1if p(i)~=';'  %~=’表示不等于的意思,p(i)即p字符串中的第i个字符
        temp=[temp p(i)];
    else
        temp=[temp '\'];
        path{index}=temp;
        index=index+1;
        temp=[];
    end
end
clear index p temp;
end

% 1、先搜索母文件下的所有子文件;
% 2、将其存储为1行N列的字符串,用p来表示;
% 3、用size(p,2)函数获取p字符串的长度,用length_p来表示,且表示为一个数;
% 4、然后用for循环,从1至length_p,步长为1,如果p(i)即p字符串中的第i个字符不等于';',则在temp中键入此字符,否则就键入‘\’。
% 5、然后将该值存储在path{}元包中,path{index}即指针加一,表示path中第几个字符(如index=2就是path中第二个字符),是用来循环扩充path{}的,最后path{}中的字符串可能为‘***\***\***’。
% 6、所以,该函数最后输出的就是path{}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
void CExample10View::OnSave555BiBitfields() { // TODO: Add your command handler code here if(lpBmpDataBuf==NULL) { MessageBox("当前没有打开的位图"); return; } BYTE r,g,b; LPBYTE lpDest,lpSrc; int i,j; int nheapSize; CFileDialog filesavebox(FALSE,"bmp","BI_BITFIELDS.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"files(*.bmp)|*.bmp|",NULL); CFile file; CString strPathname; if(m_bmi.biBitCount!=24) { MessageBox("当前打开的位图不是24位图"); return; } memcpy(&m_newbmf,&m_bmf,sizeof(BITMAPFILEHEADER)); memcpy(&m_newbmi,&m_bmi,sizeof(BITMAPINFOHEADER)); m_newbmi.biBitCount=16; m_newbmi.biCompression=BI_BITFIELDS;//即3 m_newbmi.biSizeImage=WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; m_newbmf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; m_newbmf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3; nheapSize=sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*m_newbmi.biHeight; if(lpnewBmpDataBuf!=NULL) { delete []lpnewBmpDataBuf; lpnewBmpDataBuf=NULL; } lpnewBmpDataBuf=new BYTE[nheapSize]; memcpy(lpnewBmpDataBuf,&m_newbmi,sizeof(BITMAPINFOHEADER)); DWORD* lp=(DWORD*)(lpnewBmpDataBuf+sizeof(BITMAPINFOHEADER)); *lp++=0x00007c00; *lp++=0x000003e0; *lp =0x0000001f; for(i=0;i<m_newbmi.biHeight;i++) { for(j=0;j<m_newbmi.biWidth;j++) { lpSrc=lpBmpDataBuf+sizeof(BITMAPINFOHEADER) +WIDTHBYTES(m_bmi.biWidth,m_bmi.biBitCount)*(m_bmi.biHeight-1-i) +j*3; lpDest=lpnewBmpDataBuf+sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.biWidth,m_newbmi.biBitCount)*(m_newbmi.biHeight-1-i) +j*2; b=*lpSrc++; b&=0xf8; g=*lpSrc++; g&=0xf8; r=*lpSrc++; r&=0xf8; WORD* lp=(WORD*)lpDest; *lp=0; *lp=r<<7; *lp+=(g<>3); } } if(filesavebox.DoModal()!=IDOK) return; strPath

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惗渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值