Image 通过异常处理确定损坏的JPEG图像

Image 通过异常处理确定损坏的JPEG图像,image,matlab,image-processing,exception-handling,jpeg,Image,Matlab,Image Processing,Exception Handling,Jpeg,我正在将驻留在文件夹中的.jpg文件加载到工作区,并在以后对其执行一些操作。但是,在某些文件上,我收到一条关于损坏JPEG文件的警告。我不需要用肉眼检查这些文件,但是,它们应该被排除在流程之外。因此,我需要能够确定给定的图像是否以上述方式损坏 尽管imread抛出了这样的警告,但它没有提供标志。我想使用一个函数,类似于这种方式 下面是示例代码 path=dir('*.jpg'); for i=1:length(dir) image=imread(dir(i,1).name); flag=is

我正在将驻留在文件夹中的.jpg文件加载到工作区,并在以后对其执行一些操作。但是,在某些文件上,我收到一条关于损坏JPEG文件的警告。我不需要用肉眼检查这些文件,但是,它们应该被排除在流程之外。因此,我需要能够确定给定的图像是否以上述方式损坏

尽管imread抛出了这样的警告,但它没有提供标志。我想使用一个函数,类似于这种方式

下面是示例代码

path=dir('*.jpg');

for i=1:length(dir)

image=imread(dir(i,1).name);
flag=iscorrupt(MException.last);

if (not(flag))
    ...
end
end

function out=iscorrupt(exception)
exception.message, out=isempty(strfind(exception.message,'corrupt'));

但是,此部分代码无法实现此目的,因为它取决于最后一个异常。因此,在抛出损坏警告后,它将始终设置True标志。我想知道,是否有可能使用上述方法获取所需的知识

我会将你的
imread
封装在
try/catch
习惯用语中。这样,每次抛出异常时,您都可以简单地继续循环,而不必费心读取损坏的映像。此外,在调用
dir
以及访问每个文件的实际名称时,也会出现一些轻微的输入错误。不过我会帮你解决的

试着这样做:

path = dir('*.jpg');

for i = 1 : length(path)
    try 
        im = imread(path(i).name);
        %//Continue your code here
        %...
    catch ME %//Skip to next iteration if corrupt message occurs for image i
        if (~isempty(strfind(ME.message,'corrupt')))
             continue;
        end
    end
 end

旁白:我不确定这是否可行,但看看MATLAB文档,您可以通过执行
meexception.last('reset')重置最近未捕获的异常。如果您在循环的每次迭代中都这样做,这是否也能解决您的问题?

我已经想到了这一点。离开这里以备将来参考

flag=iscorrupt(lastwarn);

...


function out=iscorrupt(exception)
out=not(isempty(strfind(lower(exception),'corrupt')));
warning('Image is ignored')
return;

肯定会的。抱歉问了一个不好的问题(与例外情况无关)。谢谢你的详细回复。绝对不是一个坏问题!你已经有了一个很好的系统,可以扔掉那些你不应该费心去看的图像。
try/catch
的工作原理是在
try
语句中输入可能引发异常的代码。只要
try
语句中的任何内容导致异常,代码将立即跳转到
catch
块,您可以在那里处理异常
ME
将包含
try
块中引发的任何异常。它类似于您在任何面向对象编程语言(C++、Java、Python)中看到的内容。希望这对你有帮助!