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

时间:2014-05-13 21:11:23

标签: image matlab image-processing exception-handling jpeg

我正在将驻留在文件夹中的.jpg文件加载到工作区,并在以后对它们执行一些操作。但是,在某些文件上,我收到有关Corrupt 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标志。我想知道,如果有可能使用上述方法捕获所需的知识。

2 个答案:

答案 0 :(得分:1)

我会将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文档,您可以通过MException.last('reset');重置最近未捕获的异常。如果你在循环的每次迭代中都这样做了,这也会解决你的问题吗?

答案 1 :(得分:0)

我已经达成了这个目标。留在这里以供将来参考。

flag=iscorrupt(lastwarn);

...


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