KK0GS (previously KD0OFN: Stillwater, MN): SSTV Image Capture on 14.230Mhz
Equipment: DX-EE Multi-Dipole @ 25', Icom IC-7410, MMSSTV.lib (Linux/LXC/Wine)

This site explores 20m signal propagation via analog SSTV. Automated signal quality characterization is performed via image analysis. This site classifies images as P5-P0 by evaulating JPEG image compressibility and discrete color distribution. Clean images typically compress better than noisy ones and noisy images generally contain large numbers of infrequently used colors. The algorithm provides reasonable results given its simplicity, but favors images with solid backgrounds. A semi-noisy solid backround P2 may classify P3 due to better JPEG compressibility of the background.

To mirror images on your site, static names are available:

  sstv.me/last-p5.jpg: last P5 image
  sstv.me/last-p4.jpg: last P4-P5 image
  sstv.me/last-p3.jpg: last P3-P5 image
  sstv.me/last-p2.jpg: last P2-P5 image
  sstv.me/last-p1.jpg: last P1-P5 image
  sstv.me/last-p0.jpg: last P0-P5 image
  sstv.me/last.jpg: last P3-P5 for 5 mins, then last P1-P5.

The receive pipeline is an Icom IC-7410 w/integrated USB Audio feeding the SSTVENG engine called by a custom app. As of April 2023, the code runs in a Linux LXC container using Wine to provide Windows compatibilty for SSTVENG. Images are stored lossless via PNG with metadata added:

  Start Time (epoch seconds)
  Duration (seconds)
  SSTV Mode
  Callsign (FSKID encoded)
  USB Sampling Rate (hz)
  Correction to Sampling Rate (PPM)
  Auto-Slant Correction Applied (PPM)
The PNGs are stored on a shared Linux network drive with incrond (inode/directory change cronjob) to trigger the processing pipeline. The PNGs are converted JPGs at 85% quality and P5-P0 analysis performed. The metadata is re-encoded into the JPG as comma-separated key=value pairs. Extracting the JPG comment will look like:
  t=1485706068,tl=110,m=Scottie-1,tp=0,rp=-226,cs=kd0ofn,fr=14230000,rt=11025
  t=receive-timestamp (epoch time)
  tl=receive duration (seconds required to receive the image)
  m=transmission mode
  tp=ppm offset of transmitter
  rp=ppm offset of receiver (previously calculated via WWV)
  cs=callsign (from FSKID)
  fr=receive frequency
  rt=audio sampling rate (typically 11khz)
Prior to Oct 2018, this site was served from qsl.net. Once qsl.net transitioned to cloudflare, the external image links became stale due to fixed caching (60 minutes). This site is now served directly from a linux origin server through cloudflare. The image browser is javascript and the images are static. When a last-*.jpg file changes, the cached version of that image is flushed from cloudflare allowing real-time updating on external sites like worldsstv.com. The script periodically polls the JSON data file timestamp to determine when to reload. The javascript can be inspected using View Page Source.

FSKID works great for callsign identification. An experiment with optical character recognition came nowhere close to its results. Using FSKID identification to train an OCR machine learning model would potentially work well, but is a future project.

Lots of folks have strong feelings about auto-slant. Appears the most common concern is letting frequency issues go uncorrected over time. This site displays images with auto-slant enabled but explicitly displays the receiver/software calibration (from WWV @ 10Mhz) and the applied auto-slant adjustment in PPM.

As an experiment in passing metadata with an sstv image, QR codes are included in my QSO images. The QR code decodes via any standard reader to a URL that redirects here. The format is HTTP://SSTV.ME%23abcdef encoded with H-level ECC (up to 30% errors). %23 is the hash-sign (HTML anchor) and ABCDEF is a 32-bit (base32) image reference. Following the QR link displays the original PNG image allowing comparison against the remotely received image.

First successful validation of QR took place Feb 20, 2018 @ ~2p Central during a 50W QSO to K01E (Rhode Island) also received by VE6PW (Calgary, ON) and uploaded to World SSTV Cam. The QSO had two images with QR codes included. The first images QR code failed to read, but the second was successful. The QR reader was the free iOS app Quick Scan (general QR reader) on an iPhone 6S.