Are there known algorithms that can detect image degradation programatically without looking at the image?
I think about obvious (visible) image artifacts of lossy re-encoding, like color
distorsion, edge noise, blockness etc.
For example, images encoded from original source with JPEG quality 80 are fine.
I hope this is right place to ask, but if moderators think that I should have asked at DSP stackexange or similar, please relink.
You need to evaluate methods for finding the artifacts that you define. Once you have those characterized, you’ll need to code up each method to find those artifacts. These methods will probably best be employed on a difference image – the original (or intermediate) minus the encoded file. You’ll probably have to analyze each color channel separately. The simplest would be a threshold – are any parts of the encoded image off by some threshold? For blockiness and edge noise, I imagine you’ll probably use some kind of Hough transform to recognize shapes/lines in the difference image, and possibly a wavelet transform or something similar that can be tuned to particular frequency patterns to pick out ringing around edges.
Edit (in response to klo’s comment):
Without a reference, I’m not sure that you’ll be able to accomplish what you want. You can still try applying the techniques I mentioned on individual color channels. The hard part will be that without a reference, you won’t necessarily be measuring any artifact, but rather image features too. You can still use some a-priori information, such as the fact that any blockiness will be oriented exactly with the image frame – not rotated. Any real image would probably be unlikely to have many nicely blocky features completely oriented with a frame. You could also apply an edge-finding algorithm like difference of gaussians or Canny edge detection, and then apply wavelet filters near the located edges to look for ringing.
For known programmable methods, see python’s scikits-image (which you know about from your post to ther mailing list) or possibly OpenCV, which has Python bindings. I’m not familiar with Matlab’s capabilities, but that would probably also work as well.