Home

Search John Harvey Photo for...
Contains Text:
Include Photo Descriptions
Include Story Pages
Include Comments
Include Scientific Names
Camera equals
Lens equals
Date is greater than or equal (Year/Month/Day)
Date is less than or equal (Year/Month/Day)
Film equals
Photographer equals
Photo Subject equals
Tag equals
PhotoOfTheDay is greater than or equal (Year/Month/Day)
PhotoOfTheDay is less than or equal (Year/Month/Day)
Gender equals
Plumage equals
Age equals
Region equals
Panoramas | Images Most Recently Modified | Images with comments | Photos over time of | Species | Parks | Videos
Search Returned...
Words 3 character or shorter are ignored. Very common words (they, them, ...) are also ignored.

Maidenhair Fern Hiding In Rocks
Saturday, May 17th, 2025 at 08:30:25
These ferns weren't having an easy time - all of them had brown parts are were cropped short. I assume a hot summer is hard on these plants.
Species: Adiantum pedatum (maidenhair)

John Harvey Photo > Blogs for 2025 to 2005 > November 2018 > Maidenhair Fern Hiding In Rocks

Nara On Rock Boundary
Saturday, May 17th, 2025 at 08:25:26
I photographed the same rock back in 2003 (22 years ago).
People: Nara

John Harvey Photo > Nara On Rock Boundary

Walking Around Outerbridge
Saturday, May 17th, 2025 at 08:24:25
Walking Around Outerbridge
John Harvey Photo > Walking Around Outerbridge

Lilies At Outerbridge
Saturday, May 17th, 2025 at 08:23:32
Lilies At Outerbridge
Species: Erythronium oregonum (White Fawnlily)

John Harvey Photo > Lilies At Outerbridge

Shooting Star In Grasses
Saturday, May 17th, 2025 at 07:38:24
Shooting Star In Grasses
Species: Primula pulchellum (dark-throat shootingstar, Few-Flowered Shootingstar)

John Harvey Photo > Shooting Star In Grasses

Claira Training To Use Lathe
Wednesday, May 14th, 2025 at 21:23:49
I was showing Claira how to move the cutter.
People: Claira

John Harvey Photo > Blogs for 2025 to 2005 > February 2025 > Claira Training To Use Lathe

Chopping Pipe To Smaller Sections
Wednesday, May 14th, 2025 at 21:22:49
Chopping Pipe To Smaller Sections
Tags: tool
People: Nara

John Harvey Photo > Blogs for 2025 to 2005 > February 2025 > Chopping Pipe To Smaller Sections

Nara Reviewing Photos At Silk Road
Wednesday, May 14th, 2025 at 21:21:55
Nara Reviewing Photos At Silk Road
People: Nara

John Harvey Photo > Blogs for 2025 to 2005 > February 2025 > Nara Reviewing Photos At Silk Road

Claira Drawing Bird Box Side
Wednesday, May 14th, 2025 at 21:20:18
Claira Drawing Bird Box Side
People: Claira

John Harvey Photo > Blogs for 2025 to 2005 > February 2025 > Claira Drawing Bird Box Side

Claira Cutting On Bandsaw
Wednesday, May 14th, 2025 at 21:19:32
Claira Cutting On Bandsaw
Tags: tool
People: Claira

John Harvey Photo > Blogs for 2025 to 2005 > February 2025 > Claira Cutting On Bandsaw

Claira With Painted Owl Box
Wednesday, May 14th, 2025 at 21:17:37
Claira With Painted Owl Box
People: Claira

John Harvey Photo > Blogs for 2025 to 2005 > February 2025 > Claira With Painted Owl Box

Claira Cutting Corner Braces
Tuesday, May 13th, 2025 at 21:05:58
Claira Cutting Corner Braces
Tags: tool
People: Claira

John Harvey Photo > Blogs for 2025 to 2005 > February 2025 > Claira Cutting Corner Braces

Nara Cutting Acrylic On Bandsaw
Tuesday, May 13th, 2025 at 21:05:30
Nara Cutting Acrylic On Bandsaw
Tags: tool
People: Nara

John Harvey Photo > Blogs for 2025 to 2005 > February 2025 > Nara Cutting Acrylic On Bandsaw

Ogden Point Urchins
Tuesday, May 13th, 2025 at 21:02:42
This is 66 images. Stabilization was done with a python script:
import cv2 
import numpy as np
import matplotlib.pyplot as plt
import pprint
import math


# /opt/homebrew/bin/ffmpeg -framerate 30 -pattern_type glob -i '*_EurchinsHg.jpg' -c:v libx264 -crf 20 EurchinsHg.mp4
# /opt/homebrew/bin/ffmpeg -i EurchinsHg.mp4 -vf "vidstabtransform=input=transforms.trf" -crf 20 EurchinsStabilized.mp4


def replace_color_with_image(background, overlay, target_color, tolerance, output_path):
    """
    Replaces a specific color in an image with another image.

    Args:
        background_path (str): Path to the background image.
        overlay_path (str): Path to the overlay image (can be the same as background if no overlay needed).
        target_color (tuple): RGB color to replace (e.g., (255, 0, 0) for red).
        tolerance (int): Tolerance range for color matching.
        replacement_image_path (str): Path to the replacement image.
        output_path (str): Path to save the output image.
    """
    if background is None or overlay is None:
        raise FileNotFoundError("One or more images not found.")

    # Create a mask for the target color
    lower_bound = np.array([max(0, c - tolerance) for c in target_color], dtype="uint8")
    upper_bound = np.array([min(255, c + tolerance) for c in target_color], dtype="uint8")
    mask = cv2.inRange(overlay, lower_bound, upper_bound)

    kernel = np.ones((3, 3), np.uint8) 
    dialated_mask = cv2.dilate(mask, kernel, iterations=1) 

    mask_rgb = cv2.merge((dialated_mask,dialated_mask,dialated_mask))

    mask_inv = cv2.bitwise_not(dialated_mask)
    mask_inv_rgb = cv2.merge((mask_inv,mask_inv,mask_inv))

    masked_background = cv2.bitwise_and(mask_rgb, background) # pixels from background where target_color is in the overlay.
    masked_overlay = cv2.bitwise_and(mask_inv_rgb, overlay) # pixels from background where target_color is in the overlay.
    combined = cv2.add(masked_background, masked_overlay)


    cv2.imwrite(output_path, combined)



f = open("transforms.trf", "w")
f.write("VID.STAB 1")
f.write("#      accuracy = 15")
f.write("#     shakiness = 3")
f.write("#      stepsize = 4")
f.write("#   mincontrast = 0.200000")
f.write("Frame 1 (List 0 [])
")

img1 = cv2.imread('0012_EurchinsHg.jpg')  
mask = cv2.imread('mask.png', cv2.IMREAD_GRAYSCALE)

currentMask = mask

#sift
sift = cv2.SIFT_create()

keypoints_1, descriptors_1 = sift.detectAndCompute(img1,mask)

for n in range(1,67): # Remember to +1 the end number.
    print("Frame " + str(n))
    img2 = cv2.imread("{:04d}_EurchinsHg.jpg".format(n)) 
    #img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

    keypoints_2, descriptors_2 = sift.detectAndCompute(img2,currentMask)

    #feature matching
    bf = cv2.BFMatcher(cv2.NORM_L1, crossCheck=True)

    matches = bf.match(descriptors_1,descriptors_2)
    matches = sorted(matches, key = lambda x:x.distance)

    # Get key points
    points1 = np.float32([keypoints_1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
    points2 = np.float32([keypoints_2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)

    # Affine matrix
    matrix, _ = cv2.findHomography(points2, points1, cv2.RANSAC, ransacReprojThreshold=5.0)


    # Align
    new_background_color = (0, 255, 0)  # Green

    aligned_image = cv2.warpPerspective(img2, matrix, (img1.shape[1], img1.shape[0]), borderValue=new_background_color)

    replace_color_with_image(img1, aligned_image, new_background_color, 1, "aligned_{:04d}_EurchinsHg.jpg".format(n))


f.close()
The actual stabilization is done with ffmpeg:
/opt/homebrew/bin/ffmpeg -framerate 30 -pattern_type glob -i 'aligned_*_EurchinsHg.jpg' -c:v libx264 -crf 20 AlignedEurchinsHg.mp4
Species: Strongylocentrotus droebachiensis (Green Sea Urchin), Strongylocentrotus purpuratus (Purple Sea Urchin)

John Harvey Photo > Ogden Point Urchins

Ogden Snails
Tuesday, May 13th, 2025 at 21:02:42
This is 44 frames. Exposure is about 1/4 of a second per frame. Total Duration is about 7 minutes. The camera is moving almost every frame. Stabilization was done with photoshop layers.
John Harvey Photo > Ogden Snails

Pacific Bleeding Heart
Tuesday, May 13th, 2025 at 21:02:41
Pacific Bleeding Heart
Species: Dicentra formosa (Pacific Bleeding Heart)

John Harvey Photo > Pacific Bleeding Heart

Parents At Beach
Tuesday, May 13th, 2025 at 21:02:41
Parents At Beach

John Harvey Photo > Parents At Beach

Pollen Under Flower
Tuesday, May 13th, 2025 at 21:02:41
Pollen Under Flower
Species: Erythronium oregonum (White Fawnlily)

John Harvey Photo > Pollen Under Flower

Purple Encrusting Sponge
Tuesday, May 13th, 2025 at 21:02:41
Purple Encrusting Sponge
Species: Haliclona permollis (Purple Encrusting Sponge)

John Harvey Photo > Purple Encrusting Sponge

Ready To Find Easter Eggs
Tuesday, May 13th, 2025 at 21:02:41
Ready To Find Easter Eggs
People: Claira, Janet, Nara

John Harvey Photo > Ready To Find Easter Eggs

More Photo Results...